Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CreateAsync avec une entité en param #252

Closed
vergerf opened this issue Oct 23, 2018 · 8 comments
Closed

CreateAsync avec une entité en param #252

vergerf opened this issue Oct 23, 2018 · 8 comments

Comments

@vergerf
Copy link

vergerf commented Oct 23, 2018

Actuellement, je ne peux pas appeler le CreateAsync en lui passant une entité.
C'est plutôt problématique lorsque je manipule des objets instanciés depuis la couche Application, c'est pas naturel de créer un Candidate de toute pièce.

Il me semble qu'il y a eu des discussions sur le sujet :/
#238

@nfaugout-lucca
Copy link
Contributor

Oui je suis d'accord avec toi, tu dois créer une Candidate et setter son .Value avec ton entité.

Et il ne faudra pas que tu oublies d'injecter un IInstanciator custom sous peine de voir ton Candidate tout simplement ignoré par la Collection ! Regarde ce code, il ignore le candidate passé en param : https://github.com/LuccaSA/RestDrivenDomain/blob/master/src/Rdd.Domain/Models/DefaultInstanciator.cs#L6

J'ai eu le même pb que toi et j'ai dû overrider : https://github.com/LuccaSA/Lucca.Auth/blob/master/Auth/v2/Domain/Auth.v2.Domain/Collections/MobileTokensInstanciator.cs#L11

@vergerf
Copy link
Author

vergerf commented Oct 24, 2018

Je suis finalement passé par une méthode du repository qui fait un Add pour moi.

@rducom
Copy link
Contributor

rducom commented Oct 26, 2018

Les prototypes de méthodes Create/Update/Delete prenant uniquement des instances de T en entrée, ont été supprimés récemment, mais je suis d'avis de les réintroduire. Ils sont indispensables pour une bonne expérience développeur, et on a pas envie de passer par un Candidate lorsqu'on fait un appel à une collection / repo depuis la couche Application.
Ce besoin est un cas d'usage très fréquent

@nfaugout-lucca
Copy link
Contributor

Je viens de tomber sur le même que toi @vergerf en mettant à niveau Lucca.Auth sur Rdd v3.0

J'en arrive à la même conclusion que @rducom, après avoir relu les 2 issues en rapport avec le sujet (#238 et #259).

Voici mon point de vue du jour :

  • remonter ICandidate/Candidate uniquement dans les couches Web et Application. Web instancie un Candidate à partir du JSON qui arrive en entrée, Application travaille sur un ICandidate et gère une étape de validation (qui reste dans le TEntity du Domain).
  • si la validation est concluante, alors Application appelle le CreateAsync du Domain (sur la collection) avec un TEntity et non plus un ICandidate

Ce qui revient à ce que propose Raph, càd réintroduire des méthodes Create & co avec des TEntity, mais en allant plus loin, càd en virant les méthodes actuelles qui prennent un ICandidate.

En attendant je vais créer une classe dans mon Domain Lucca.Auth qui implémente ICandidate et qui renvoie l'entité que j'ai sous la main dans son .Value et qui throw sur toutes les autres propriétés/méthodes.

@bebelz
Copy link

bebelz commented Dec 17, 2018

Je viens aussi de tomber dans un cas ou je suis bloqué par la signature de cette méthode.

@nfaugout as-tu pu implémenter un ICandidate en attendant que RDD propose les méthodes en question ?

@nfaugout-lucca
Copy link
Contributor

Oui, mais pas encore pushé, voici le code


    public class DomainCandidate<TEntity, TKey> : ICandidate<TEntity, TKey>
		where TEntity : IEntityBase<TKey>
	{
		TEntity _entity;

		public DomainCandidate(TEntity entity)
		{
			_entity = entity;
		}

		TKey ICandidate<TEntity, TKey>.Id => _entity.Id;
		object ICandidate<TEntity>.Id => _entity.Id;
		TEntity ICandidate<TEntity>.Value => _entity;
		JsonObject ICandidate<TEntity>.JsonValue => throw new NotImplementedException();
		bool ICandidate<TEntity>.HasId() { return true; }
		bool ICandidate<TEntity>.HasProperty<TProp>(Expression<Func<TEntity, TProp>> expression) { throw new NotImplementedException(); }
	}

@bebelz
Copy link

bebelz commented Dec 18, 2018

@nfaugout j'aurais besoin que mon DomainCandidate implémente aussi .JsonValue, tu aurais un bout de code qui fait ça simplement sous la main ?

@nfaugout-lucca
Copy link
Contributor

Tu devrais demander à @Poltuu moi j'en ai pas eu besoin d'où mon implémentation.

En gros il faut partir de _entity et faire un .ToJson ou équivalent, Romain va savoir quoi faire.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants