Я прочитал некоторые из вопросов, касающихся моделей анемичных доменов и разделения проблем. Каковы наилучшие методы для выполнения/присоединения логики домена на объектах аномальной области? На моей работе у нас довольно анемичная модель, и в настоящее время мы используем "вспомогательные" классы для выполнения базы данных/бизнес-логики на объектах домена. Например:
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.
}
}
Когда приложение должно совершить покупку, оно создаст StoreHelper и вызовет метод на объектах домена. Для меня было бы разумным, чтобы Клиент/Продукт знал, как сохранить себя в репозитории, но вам, вероятно, не нужны методы Save() для объектов домена. Это также имеет смысл для метода, такого как Customer.Purchase(Product), но это ставит доменную логику на объект.
Вот некоторые методы, с которыми я столкнулся, не уверены, какие из них хорошие/плохие:
- Клиент и продукт наследуются от класса "Entity", который предоставляет основные операции CRUD общим способом (возможно, с использованием ORM).
- Плюсы: каждый объект данных автоматически получает операции CRUD, а затем привязывается к базе данных /ORM
- Минусы: это не решает проблему бизнес-операций над объектами, а также связывает все объекты домена с базовым объектом, который может быть непригоден.
- Используйте вспомогательные классы для обработки операций CRUD и бизнес-логики
- Имеет ли смысл иметь DAO для операций "чистой базы данных" и отдельных бизнес-помощников для более конкретных бизнес-операций?
- Для этого лучше использовать нестатические или статические вспомогательные классы?
- Плюсы: объекты домена не привязаны к какой-либо базе данных/бизнес-логике (полностью анемии)
- Минусы: не очень OO, не очень естественно использовать помощников в коде приложения (выглядит как код C)
- Используйте метод Double Dispatch, где у объекта есть методы для сохранения в произвольном хранилище
- Плюсы: лучшее разделение проблем
- Минусы: объекты имеют некоторую дополнительную логическую привязку (хотя она развязана)
- В С# 3.0 вы можете использовать методы расширения для присоединения CRUD/бизнес-методов к объекту домена, не касаясь его
- Это действительный подход? Какие плюсы и минусы?
- Другие методы?
Каковы наилучшие методы обработки этого? Я новичок в DDD (я читаю книгу Эванса - возможно, это откроет мне глаза)