Наша модель предметной области сейчас очень анемична.Наши объекты - это в основном пустые оболочки, почти полностью предназначенные для хранения ценностей и навигации по коллекциям.
Мы используем ORM-код EF 4.1 с первым кодом, и до сих пор мы стремились оградить наших начинающих разработчиков от страшного исключения «LINQ to Entities не может преобразовать blablabla в выражение хранилища» при выполнении запросов к контексту во времяранние итерации.
У нас есть различные агрегированные корневые интерфейсы хранилища через EF.Однако некоторые блоки кода в impls кажутся ответственными за домен.Пока интерфейс репозитория объявлен в домене, а impl находится в инфраструктуре (внедрена зависимость), считается ли плохим проектом передача интерфейса репозитория в качестве аргумента методу класса сущности (или другого домена)?
Например, будет ли это плохо?
public class EntityAbc {
public void SaveTo(IEntityAbcRepository repos) {...}
public void DeleteFrom(IEntityAbcRepository repos) {...}
}
Что если конкретному объекту необходим доступ к другим агрегированным корневым репозиториям?Будет ли это нормально или нет, и почему?
public void Save() {
var abcRepos = DependencyInjector.Current.GetService<IEntityAbcRepository>();
var xyzRepos = DependencyInjector.Current.GetService<IEntityXyzRepository>();
// work with repositories
}
Обновление 1
Я не упомянул о переносе кода на прикладной уровень, потому что я рассматриваю часть кодакоторый использует IEntityAbcRepository для обеспечения применения бизнес-правил.Impl хранилища должен быть как можно более ванильным, верно?Его основной обязанностью должна быть простая абстракция над ORM, позволяющая вам находить / добавлять / обновлять / удалять сущности.Неправильно?
Кроме того, этот вопрос относится к методам в других классах доменов, не относящихся к сущности - фабриках, службам, независимо от того, какой шаблон может быть подходящим.Суть в том, что я задаю вопрос о любом методе в классе домена, а не только в классе сущности.@Eranga, это единственное место, где вы можете использовать инжектор конструктора, потому что фабрики и сервисы не являются частью ORM.
Затем прикладной уровень может координировать поток, внедряя impl-репозиторий в его конструктор и передавая его в качестве аргумента доменной службе или фабрике.Это плохая практика?
Обновление 2
Добавление еще одного пояснения здесь.Что если домену нужен только доступ к IEntityAbcRepository для выполнения его методов Find ()?В приведенном выше примере методы SaveTo и DeleteFrom не будут вызывать какие-либо методы добавления / обновления / удаления в интерфейсе репозитория.
До сих пор мы объединяли методы поиска / добавления / обновления / удаления в едином агрегированном интерфейсе корневого хранилища для простоты.Но я полагаю, что ничто не мешает нам разделить их на 2 интерфейса, например:
- IEntityAbcReadRepository <- определяет все сигнатуры метода find </li>
- IEntityAbcWriteRepository <- определяет все add /обновить / удалить метод sigs </li>
В этом случае было бы плохой практикой передавать IEntityAbcReadRepository в качестве параметра методу домена?