У меня проблемы с подключением DDD и EF Core.
Я делаю проект с использованием архитектуры DDD. В качестве уровня доступа к данным я использую общий шаблон единиц работы, взятый из здесь .
public interface IUnitOfWork
{
IRepository<TDomain> Repository<TDomain>() where TDomain : class;
}
public interface IRepository<TDomain>
{
TDomain Get(Expression<Func<TDomain, bool>> predicate);
}
Понимая эти интерфейсы, я использую EF Core.
У меня есть некоторая модель предметной области с 2 классами
public class MainClass
{
public int Id { get; set; }
public List<RelatedItem> Items { get; set; }
}
public class RelatedItem
{
public int Id { get; set; }
public MainClass Parent { get; set; }
public DateTime Date { get; set; }
public string SomeProperty { get; set; }
}
В реальной жизни моего проекта MainClass
имеет коллекцию с сотнями RelatedItems
. Для выполнения некоторых операций мне нужен только один RelatedItem
на запрос с определенной датой. Это можно сделать, выполнив поиск через свойство Items
.
Инкапсуляция производительности EF Core в единицу работы. Я должен явно загружать сущности из БД со связанными элементами, потому что уровень входа в систему бизнеса ничего не знает о реализации репозитория UnitOfWork. Но эта операция очень медленная.
Поэтому я решил создать MainClassService
, который внедряет в конструктор unitOfWork
и имеет метод, который возвращает только один RelatedItem
, и он отлично работает.
public class MainClassService
{
IUnitOfWork unitOfWork;
public MainClassService(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork ?? throw new ArgumentNullException();
}
public RelatedItem GetRelatedItemByDate(int mainClassId, DateTime date)
{
return unitOfWork.Repository<RelatedItem>().Get(c => c.Parent.Id == mainClassId && c.Date == date);
}
}
Итак, у меня есть ситуация, когда я не могу использовать свойство Items
напрямую из-за EF Core, но я должен использовать их из-за архитектуры DDD.
И мой вопрос: можно ли использовать такую конструкцию?