1

je l'entité de domaine suivant:Dto et entités de domaine. Ai-je créé mon dto correctement?

public class CartItem 
{ 
    public virtual Guid Id { get; set; } 
    public virtual Guid SessionId { get; set; } 
    public virtual int Quantity { get; set; } 
    public virtual Product Product { get; set; } 
} 

Je la DTO suivante:

public class CartItemDTO 
{ 
    public CartItemDTO(CartItem cartItem) 
    { 
     Id = cartItem.Id; 
     Quantity = cartItem.Quantity; 
     Name = cartItem.Product.Name; 
     Price = cartItem.Product.Price; 
    } 

    public Guid Id { get; private set; } 
    public int Quantity { get; private set; } 
    public string Name { get; private set; } 
    public decimal Price { get; private set; } 
} 

Le flux de travail actuel est assez simple: mon dépôt retourne un IEnumerable de type CartItem. Mon service le transforme en dto (CartItemDTO). Mon contrôleur passe ensuite à la vue. Jusqu'ici tout va bien.

Maintenant, je veux mettre en œuvre un total pour chacun des postes. J'ai ajouté la propriété suivante à CartItemDTO.

public decimal Total { get; private set; } 

J'ai ensuite ajouté le code suivant au constructeur CartItemDTO.

Total = cartItem.Quantity * cartItem.Product.Price; 

Ma première question est de savoir si ce est une approche des meilleures pratiques? Si non, pourquoi? Dois-je avoir ajouté la propriété Total ailleurs? Si oui, pourquoi?

Je voulais aussi mettre en œuvre un total pour l'ensemble du panier pour que je crée une nouvelle classe (ci-dessous) et modifié mon service à rendre.

public class CartItemResult 
{ 
    public CartItemResult(IEnumerable<CartItemDTO> result) 
    { 
     CartItems = new List<CartItemDTO>(result); 
     Total = result.Sum(total => total.Total); 
    } 

    public IList<CartItemDTO> CartItems { get; private set; } 
    public decimal Total { get; private set; } 
} 

je pourrais maintenant passer soit la nouvelle classe à la vue ou créer un ViewModel séparé et transmettre le contenu de la nouvelle classe au ViewModel et passer que le point de vue.

Ma deuxième question est, encore une fois si cette approche est une approche des meilleures pratiques? Sinon, pourquoi et qu'aurais-je dû faire différemment?

Répondre

3

Personnellement, pour l'extraction de données, je suggère de renvoyer l'entité POCO du référentiel et de le mapper au ViewModel dans le contrôleur (Automapper). Il n'y a pas besoin d'avoir un objet intermédiaire vraiment.

Il est à votre conception où doit être mis en œuvre la propriété Total. Cette propriété est-elle utilisée dans le domaine pour toute logique métier? Est-ce que ça pourrait être? Si ce n'est pas le cas, vous pourriez considérer cela comme un problème de présentation et adapté à ViewModel. Pour la mise à jour des données, renvoyez quelque chose comme un CartItemUpdateViewModel dans votre interface utilisateur qui correspond à une entité de domaine CartItemUpdateDetails dans le contrôleur qui est ensuite transmis à la méthode de référentiel.

En ce qui concerne votre question concernant la CartItemResult va. Je mettrais personnellement la logique Total dans un ViewModel et remplirais ce ViewModel dans le contrller à partir d'une méthode de référentiel retournant IEnumerable<CartItem>.

Jetez un coup d'oeil au projet WhoCanHelpMe pour une bonne application de l'entreprise mettant en vedette DDD.

5

DTO est pure classe pour transférer des données. Il ne devrait pas contenir de logique. Vous avez ajouté un tag de conception orienté domaine, donc je pense que vous souhaitez utiliser des objets de domaine et des services de domaine. C'est la responsabilité de votre objet de domaine (CartItem) pour calculer le total pour l'article. L'objet de domaine est la logique de données + d'affaires et les règles fonctionnant avec ces données. Le total informatique est la logique métier. Aussi pour votre deuxième partie (CartItemResult) ceci est habituellement traité par quelque chose appelé service de domaine.Le service de domaine fournit une logique métier qui n'est pas liée à un objet à domaine unique mais qui fonctionne à la place avec de nombreux objets de domaine. Mais vous devriez aussi penser à la complexité de votre projet. Avez-vous vraiment besoin de cela? N'utilisez pas de modèles uniquement parce qu'ils existent, trouvez toujours des raisons de les utiliser. L'approche mentionnée par David Neale est également correcte pour certaines applications. Cordialement, Ladislav