【发布时间】:2018-07-11 19:36:25
【问题描述】:
假设我们有一个具有多个相同类型的多对多导航字段的实体:
class Post : IdProvider<TPrimaryKey>
where TKey : struct
{
...
public virtual ICollection<User> LikedBy { get; set; }
public virtual ICollection<User> SharedBy { get; set; }
}
请记住,这纯粹是一个虚构的例子,它可以是任何具有相同类型的两个属性的东西。
我目前正在为this manner 中注册的单个实体运行基本通用存储库类。定义如下所示:
EntityRepository<TKey, T> : EntityRepositoryBase, IEntityRepository<TKey, T>
where T : class, IIdProvider<TKey>
where TKey : struct
DI 选择正确的 typeparam 并将其注入我的 repos,就像一个魅力。我对 DI 很陌生并且阅读了this article,但仍然很难理解为什么它让我的生活更轻松并将 EF 特定方法隐藏在控制器的视线之外。
然后我有 N 对多的基础存储库类来处理两个实体之间的关系。也许这是一种过度简化,但我想认为每个多对多关系都有主体和依赖关系,所以我将在帖子中添加喜欢/共享的用户,反之亦然。在我当前的实现中,基础 repo 类有一个抽象属性
public abstract Expression<Func<TPrincipal, ICollection<TDependent>>> GetDependentCollectionExpression { get; }
所以我不能使基础 repo 类成为非抽象类,目前必须为我的每个明确指定依赖属性的关系创建此类的多个实现。
class PostToLikedUsersRepository : PrincipalToManyDependentRepository<Post, User>
{
...
public override Expression<Func<Post, ICollection<User>>> GetDependentCollectionExpression
{
get { return item => item.LikedBy; }
}
}
摆脱它的一种方法是通过反射搜索具有 TDependent 类型的正确 TPrincipal 的属性,但在当前示例中会有很多这样的属性。我从没想过如何处理同一个 Principal to Dependent 类型的多个 repos 实现,因为我不确定如何让 DI 将每个 repo 的正确实现注入每个控制器:一个负责点赞,一个负责共享.
所以我的直觉和意图是以某种方式参数化属性选择。似乎我需要向我的 repo 注入另一个参数来自动获取正确的属性,但我不知道如何实现它。我应该在这里注入财产吗?但是我应该如何以及在哪里以一般方式为其选择正确的值?它应该是另一个构造函数参数吗?
【问题讨论】:
标签: c# entity-framework simple-injector