{"action":"created","issue":{"url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/97","repository_url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain","labels_url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/97/labels{/name}","comments_url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/97/comments","events_url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/97/events","html_url":"https://github.com/LuccaSA/RestDrivenDomain/issues/97","id":300017273,"number":97,"title":"RDD v2.2 - #3 PostedData vs ICandidate","user":{"login":"nfaugout","id":2686141,"avatar_url":"https://avatars0.githubusercontent.com/u/2686141?v=4","gravatar_id":"","url":"https://api.github.com/users/nfaugout","html_url":"https://github.com/nfaugout","followers_url":"https://api.github.com/users/nfaugout/followers","following_url":"https://api.github.com/users/nfaugout/following{/other_user}","gists_url":"https://api.github.com/users/nfaugout/gists{/gist_id}","starred_url":"https://api.github.com/users/nfaugout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nfaugout/subscriptions","organizations_url":"https://api.github.com/users/nfaugout/orgs","repos_url":"https://api.github.com/users/nfaugout/repos","events_url":"https://api.github.com/users/nfaugout/events{/privacy}","received_events_url":"https://api.github.com/users/nfaugout/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2018-02-25T11:11:06Z","updated_at":"2018-03-16T08:34:41Z","closed_at":null,"author_association":"OWNER","body":"Dans Lucca, l'objet de PostedData était de pouvoir décorer un JSON entrant (POST, PUT), pour que le Domain puisse valider la req (est-ce que telle propriété est présente, etc...)\r\n\r\nRomain a fait une version alternative qui utilise directement les JToken de Json.Net, c'est mieux, mais ça manque de contrôle sur le côté introspectif de l'objet posté.\r\n\r\nLe mini POC #93 vise à proposer un embryon de ce que pourrait être ce concept de ICandidate.\r\n\r\nL'idée c'est que la couche web prend le JSON entrant et en fait un ICandidate, avec un .Value qui correspond à la désérialisation brute vers T sur JSON. Intéressant pour une Collection basique qui enregistrera tel quel l'objet après avoir joué la Validation basique.\r\n\r\nEt des accesseurs, genre .HasProperty(..) qui prend une expression et permet de savoir si le JSON contient telle ou telle propriété, et ainsi pouvoir aiguiller le code métier en fonction.\r\n\r\nEn gros on aura 2 types de Collections :\r\n\r\n- celles qui vont s'intéresser à .Value, car elles veulent modifier à la marge l'objet envoyé et l'enregistrer quasi tel quel. Ici on est sur une API REST classique.\r\n- celles qui utilisent l'objet envoyé juste comme un support pour un traitement qui n'a rien à voir. Ici on est soit sur un Service, soit sur une Command."},"comment":{"url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/comments/373640934","html_url":"https://github.com/LuccaSA/RestDrivenDomain/issues/97#issuecomment-373640934","issue_url":"https://api.github.com/repos/LuccaSA/RestDrivenDomain/issues/97","id":373640934,"user":{"login":"nfaugout","id":2686141,"avatar_url":"https://avatars0.githubusercontent.com/u/2686141?v=4","gravatar_id":"","url":"https://api.github.com/users/nfaugout","html_url":"https://github.com/nfaugout","followers_url":"https://api.github.com/users/nfaugout/followers","following_url":"https://api.github.com/users/nfaugout/following{/other_user}","gists_url":"https://api.github.com/users/nfaugout/gists{/gist_id}","starred_url":"https://api.github.com/users/nfaugout/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nfaugout/subscriptions","organizations_url":"https://api.github.com/users/nfaugout/orgs","repos_url":"https://api.github.com/users/nfaugout/repos","events_url":"https://api.github.com/users/nfaugout/events{/privacy}","received_events_url":"https://api.github.com/users/nfaugout/received_events","type":"User","site_admin":false},"created_at":"2018-03-16T08:34:41Z","updated_at":"2018-03-16T08:34:41Z","author_association":"OWNER","body":"J'ai trouvé un truc assez cool dans Json.NET, la notion de JsonSchema et la possibilité de valider du JSON contre un schéma (qu'on peut générer à partir d'un type T en plus !!) via un générateur.\r\n\r\nCa indique si le JSON est valide, et on peut même récupérer les erreurs, ça correspond quasi 100% à la notion de ICandidate décrite ici.\r\n\r\nVoici une méthode de parsing qui utilise tout ça :\r\n\r\n```\r\nstatic bool TryParse<T>(string jsonData, out T result, out IList<string> errors) where T : new()\r\n{\r\n\tJSchemaGenerator generator = new JSchemaGenerator();\r\n\tJSchema parsedSchema = generator.Generate(typeof(T));\r\n\tvar jObject = JObject.Parse(jsonData);\r\n\r\n\ttry\r\n\t{\r\n\t\tresult = JsonConvert.DeserializeObject<T>(jsonData);\r\n\t}\r\n\tcatch\r\n\t{\r\n\t\tresult = default(T);\r\n\t}\r\n\r\n\treturn jObject.IsValid(parsedSchema, out errors);\r\n}\r\n```\r\nC'est une version adaptée de : https://stackoverflow.com/questions/23906220/deserialize-json-in-a-tryparse-way\r\n\r\nLa doc sur JsonSchema : https://www.newtonsoft.com/json/help/html/JsonSchema.htm\r\n"}}
{"actor":{"display_login":"nfaugout"}}