Я знаю, что вокруг темы много потоков, но я не нашел сообщений, которые меня удовлетворили, и действительно объясняет, как развивать бизнес-логику в рамках сущности. Поэтому в этом посте я хочу подвести итог тому, что получил, прочитав разные другие сообщения, а затем попрошу помочь мне очистить свой разум.Бизнес-логика в сущности и инъекции DbContext
Сущности: Это мои классы, которые сопоставляются таблицам в базе данных, такие как Пользователь, Сделка, Заказ и т. Д. Это объекты POCO (и я использую их с помощью подхода Code-First).
Модель домена: Это место, где должна быть бизнес-логика. Мне потребовалось довольно много времени, чтобы модель домена не являлась саметом в качестве EF.
Service-Layer: Я понял, что сервисный уровень не нужен в первую очередь. Его можно использовать для приведения в него некоторых вещей, но в целом бизнес-логика должна быть в модели. Поэтому лучше проговорился
Repository-Layer: Ok мы можем написать репозиторий с CRUD-методы, как IEnumerable GetUsers()
, которые делают тестирование проще, но с другой стороны, мы потеряем целые функции LINQ, и это много больше писем. Для тестирования я могу также высмеять EF Framework, поэтому для меня не существует слоя репозитория.
Unit-Of-Work: Сам DbContext является подразделением работы. Поэтому мне не нужно ничего кодировать здесь, мне просто нужно передать DbContext ко всем моим методам и вызвать SaveChanges по завершении.
Lazy-Loading: Иногда я использовал его, иногда я использовал Eage Loading. Но в то же время я понял, что Lazy-Loading - это необходимость, когда вы хотите сделать материал Unit-Of-Work и сохранить свой код в чистоте. Когда вы находитесь в методе и получаете некоторый код, который передается в это от другого метода, который, в свою очередь, получил это от другого метода ... вы просто хотите получить доступ к свойствам. Вам все равно, находятся ли данные или нет. Он должен загружаться автоматически. Поэтому мне интересно, как это сделать без какой-либо ленивой загрузки.
DbContextScopes: Как и в других обсуждаемых сообщениях, мы не должны использовать DbContext для экземпляра приложения, мы не должны также использовать его для запроса. Вместо этого мы должны создать один DbContext для текущей задачи и передать его всем необходимым методам. Это можно сделать проще с помощью [DbContextScopeFactory] [1].
Инъекция зависимостей: Я всегда должен использовать DI для ввода необходимых материалов в конструктор. Это имеет смысл, потому что, когда у нас есть единичный тест, мы можем просто добавить макет ресурсов. Я также читал, что инъекция атрибутов не так хороша и не должна использоваться.
Сделки: should'nt больше не используется, потому что у них есть много проблем. Вместо этого придерживайтесь Unit-Of-Work (который внутренне использует транзакцию ?!) и моделирует вашу архитектуру таким образом.
Так что теперь мне интересно, как реально использовать этот материал.
Вопрос 1: Модель = сущность?
Следует ли создать какую-либо отдельную модель домена или ее можно включить в модель сущности?Я думаю, что дополнительная модель домена кажется намного более сложной. Почему бы не написать логику в сущности? Какие проблемы?
Вопрос 2: Как получить DbContext?
Когда я добавить объект, то я не хочу, чтобы добавить инфраструктуры вещи, как
order.Lines.Add(new OrderLine(product, qty, text));
и не
order.Lines.Add(new OrderLine(dbcontext, product, qty, text));
Возможно приписывать инъекции зависимостей является решением, но, как сказал, что также не очень хорошая модель ...
Простите, это совершенно неправильно. DDD распространяет богатые модели, которые не являются представлением базы данных. Это называется персистентными моделями. Следует отметить, что богатые домены, использующие модели ORM или персистентности, являются довольно сложной темой. DDD с богатыми доменами лучше всего работает с источником событий (и CQRS). Наличие моделей, которые переносят только данные, а не логики, приводит к раздутым и трудноподдерживаемым услугам, где модель может легко оказаться в несогласованном состоянии. – Tseng
Это не так, потому что это не соответствует определенной методологии.Этот вопрос не является подходящим для SO, потому что он не является конкретным и очень субъективным. Спасибо за ваши 2 цента, хотя я даже не слышал о DDD. – Luke