J'ai lu certaines des questions concernant les modèles de domaine anémiques et la séparation des préoccupations. Quelles sont les meilleures techniques pour effectuer/attacher la logique de domaine sur des objets de domaine anémiques? Dans mon travail, nous avons un modèle assez anémique, et nous utilisons actuellement des classes «helper» pour exécuter la base de données/la logique métier sur les objets du domaine. Par exemple:Techniques pour traiter le modèle de domaine anémique
public class Customer
{
public string Name {get;set;}
public string Address {get;set;}
}
public class Product
{
public string Name {get;set;}
public decimal Price {get;set;}
}
public class StoreHelper
{
public void PurchaseProduct(Customer c, Product p)
{
// Lookup Customer and Product in db
// Create records for purchase
// etc.
}
}
Lorsque l'application doit faire un achat, il créerait le StoreHelper et appeler la méthode sur les objets de domaine. Pour moi, il serait logique que le client/produit sache comment se sauver dans un dépôt, mais vous ne voudriez probablement pas de méthodes Save() sur les objets du domaine. Cela aurait aussi du sens pour une méthode comme Customer.Purchase (Product), mais cela met la logique du domaine sur l'entité.
Voici quelques techniques que j'ai rencontré, pas sûr sont bons/mauvais:
- hériteront Client et produit d'une classe « entité », qui fournit les opérations CRUD de base d'une manière générique (en utilisant un ORM peut-être).
- Plus: Chaque objet de données serait automatiquement obtenir les opérations CRUD, mais sont ensuite liés à la base de données/ORM
- Inconvénients: Cela ne résout pas le problème des opérations commerciales sur les objets, et aussi des liens tous les objets de domaine à une entité de base qui pourrait ne pas être appropriée
- Utiliser des classes d'aide pour gérer les opérations CRUD et la logique métier
- est-il logique d'avoir OTI pour les opérations de « base de données pures », et des aides d'affaires séparées pour eux opérations spécifiques à l'entreprise?
- Est-il préférable d'utiliser des classes auxiliaires non statiques ou statiques pour cela?
- Avantages: objets de domaine ne sont pas liés à une base de données/logique métier (complètement anémique)
- Inconvénients: pas très OO, pas très naturel d'utiliser les aides dans le code d'application (qui ressemble à du code C)
- Utilisez la technique Double Dispatch où l'entité a des méthodes pour enregistrer dans un répertoire arbitraire
- plus: une meilleure séparation des préoccupations
- Inconvénients: les entités ont une certaine logique supplémentaire ci-joint (bien qu'il soit découplé)
- En C# 3.0, vous pouvez utiliser des méthodes d'extension pour fixer les méthodes CRUD/d'affaires à un objet de domaine sans le toucher
- Est-ce une approche valable? Quels sont les avantages/inconvénients?
- D'autres techniques?
Quelles sont les meilleures techniques pour gérer cela? Je suis assez nouveau à DDD (je lis le livre d'Evans - ainsi peut-être que cela ouvrira mes yeux)
On dirait qu'il y a BEAUCOUP de classes différentes pour gérer un client. Pourquoi ne pas en lancer la majeure partie dans une seule classe, avec un service pour gérer quelque chose de complexe? –
Ma réponse est vieille comme l'enfer. : D –
@LuckyLindy Principalement parce que DDD est sur le point de créer un pont entre les experts du domaine et les programmeurs. Le modèle de domaine ne doit pas contenir d'éléments techniques, sinon le langage omniprésent ne pourra pas exister. Pour sortir des trucs techniques - nous devons l'abstraire. L'abstraction de quelque chose gonfle toujours la base du code. –