Я прочитал некоторые из вопросов, касающихся моделей анемичных доменов и разделения проблем. Каковы наилучшие методы для выполнения/присоединения логики домена на объектах аномальной области? На моей работе у нас довольно анемичная модель, и в настоящее время мы используем «вспомогательные» классы для выполнения базы данных/бизнес-логики на объектах домена. Например:Методы обработки аномальной модели домена
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, но затем привязаны к базе данных/ОРМ
- Минусы: Это не решает проблему бизнес-операций на объектах, а также связывает все объекты домена к базовой Сущности, которая не может быть целесообразным
- Используйте вспомогательные классы для обработки операций CRUD и бизнес-логику
- ли смысл иметь объекты DAO для «чистой базы данных» операций, а также отдельные бизнес-хелперы для них рудные операции бизнеса?
- Лучше использовать для этого нестатические или статические вспомогательные классы?
- Pros: объекты домена не привязаны к какой-либо базе данных/бизнес-логики (полностью анемией)
- Минусы: не очень OO, не очень естественно использовать помощников в коде приложения (выглядит как код C)
- Используйте технику Double диспетчерской, где компания имеет методы для сохранения произвольного хранилища
- Плюсы: лучшее разделение задач
- Cons: объекты имеют некоторую дополнительную логику прикрепленную (хотя это развязано)
- В C# 3.0, вы можете использовать методы расширения для присоединения CRUD/бизнес-методы для объекта домена, не касаясь его
- Является ли это действительный подход? Каковы плюсы и минусы?
- Другие техники?
Каковы наилучшие методы обработки этого? Я довольно новичок в DDD (я читаю книгу Эванса - так, может быть, это откроет мне глаза)
Кажется, что много разных классов просто для обслуживания клиента. Почему бы не бросить большую часть этого в одном классе, с сервисом для обработки чего-либо сложного? –
Мой ответ старый, как ад. : D –
@ LuckyLindy В основном потому, что DDD - это создание моста между экспертами домена и программистами. Модель домена не должна содержать технических средств, иначе вездесущий язык не сможет существовать. Чтобы выйти из технического материала - мы должны его абстрагировать. Абстрагирование чего-то всегда раздувает базу кода. –