Я играл с Луковая архитектура , DDD и Шаблон спецификации . Существует множество реализаций с Entity Framework, , где сущности домена идут прямо в DBSet <> контекста . Для меня это не нормально, по крайней мере, из-за отношений «многие ко многим». Допустим, у нас есть следующие dbo:
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class Tag
{
public string TagId { get; set; }
public string Name { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class PostTag
{
public int PostId { get; set; }
public Post Post { get; set; }
public string TagId { get; set; }
public Tag Tag { get; set; }
}
Проблема в том, что модели сущностей не должны ничего знать о Post.PostTag
, потому что это подробности реализации персистентного слоя. Например, я могу изменить хранилище на JSON объектов, и больше не требуется промежуточная таблица. Итак, в идеале, мои модели сущностей будут выглядеть так:
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<Tag> Tags { get; set; }
}
public class Tag
{
public string TagId { get; set; }
public string Name { get; set; }
}
Или это будет еще хуже, если мы решим добавить какое-то новое свойство к PostTag
, например
public class PostTag
{
...
public bool IsActive { get; set; }
...
}
Тогда это повлияет на Tag
при рассмотрении этого примера с моделью сущности.
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<Tag> Tags { get; set; }
}
public class Tag
{
public string TagId { get; set; }
public bool IsActive { get; set; } // this is added
public string Name { get; set; }
}
Из-за этого я хочу, чтобы и entity и dbo моделей. Когда я реализую PostRepository, который расположен на уровне инфраструктуры, и я хочу выставить IQueriable<Post> Query()
. Вот настоящие проблемы начались. Причина проблем заключается в том, что прикладной уровень, являющийся потребителем репозитория, может работать только внутри объекта Post
, но не PostDbo
. И они могут быть разными. Из-за этого я не могу написать спецификацию для этой сущности. Итак, главный вопрос заключается в том, как реализовать шаблон Repository, который может предоставлять такой метод Query()
, при этом отдельные модели entity
и dbo
не оказывают серьезного влияния на производительность и оптимальность запросов.
Или, может быть, шаблон спецификации - это просто огромные накладные расходы, которые более вредны, чем полезны. Причина в том, что когда вы решаете изменить структуру сущностей на что-то другое, вам следует написать свой собственный поставщик запросов для Expression<Func<TEntity>>
. Как вы думаете?
Может быть, я что-то не так, поправьте меня, пожалуйста. Буду благодарен за разумные ответы.
Спасибо