如何使用依赖注入与通用数据集
问题描述:
我有一个接口我希望用来执行有效性检查,就像传入一个id到一个方法一样简单,它应该返回true或false,无论该实体是否存在。我不想为我的每个存储库都实现这个实现,所以我创建了一个单独的接口IValidityCheck<T> where T: DbSet<T>
,如下所示。如何使用依赖注入与通用数据集<T>
public interface IValidityCheck<T> where T: DbSet<T>
{
bool IsValid(Guid id, T entitySet);
}
现在在我的.net核心应用程序中,我正在尝试为此添加依赖项。我有类似的东西。
services.AddTransient<IValidityCheck<DbSet<School>>, ValidityCheck<DbSet<School>>>();
,但我得到像
类型错误 “Microsoft.EntityFrameworkCore.DbSet” 不能用作在通用类型的类型参数“T”或方法 “IValidityCheck”。有一个从 “Microsoft.EntityFrameworkCore.DbSet” 到 “Microsoft.EntityFrameworkCore.DbSet>”
我知道将其更改为约束,以where T: class
将使它更容易的隐式引用转换,但我想的约束具体到DbSet
答
你有2种选择:
1)您可能需要一个参数。就像这样:
public interface IValidityCheck<T, I> where T: DbSet<I>
,并使用它像这样:
services.AddTransient<IValidityCheck<DbSet<School>, School>, ValidityCheck<DbSet<School>,School>>();
2)另一种可能性是,你可以抽象那DbSet远通过引入多一个接口:
public interface IValidityCheckBase<T> where T: class
{
bool IsValid(Guid id, T entitySet);
}
public interface IValidityCheck<T> : IValidityCheckBase<DbSet<T>>
{
}
你的榜样通用执行:
public class ValidityCheck<T> : IValidityCheck<T>
{
public bool IsValid(Guid id, DbSet<T> entitySet)
{
return false;
}
}
然后,它甚至应该工作,没有声明DbSet在您的泛型类型的使用,因为你要迫使它无论如何DbSet,这应该是更简洁:
services.AddTransient<IValidityCheck<School>, ValidityCheck<School>>();
在这种DEMO,我用List<T>
相反,但它应该是相似的。我个人喜欢2)选项。你会发现代码在演示中编译得很好。
T怎么可能是DbSet?我认为你需要另一个通用变量 –
你的定义就像一个无限递归循环。 'public interface IValidityCheck where T:DbSet 'and'services.AddTransient ,School>,ValidityCheck ,School >>();' –