C# 如何将依赖项注入与通用dbset一起使用<;T>;
我有一个我希望用来执行有效性检查的接口,就像将id传递给方法一样简单,它应该返回true或false,无论该实体是否存在。我不希望每个存储库都有这个实现,所以我创建了一个单独的接口C# 如何将依赖项注入与通用dbset一起使用<;T>;,c#,generics,dependency-injection,interface,.net-core,C#,Generics,Dependency Injection,Interface,.net Core,我有一个我希望用来执行有效性检查的接口,就像将id传递给方法一样简单,它应该返回true或false,无论该实体是否存在。我不希望每个存储库都有这个实现,所以我创建了一个单独的接口ivalidycheck,其中T:DbSet,如下所示 public interface IValidityCheck<T> where T: DbSet<T> { bool IsValid(Guid id, T entitySet); } 公共接口IValidyCheck其中T:Db
ivalidycheck,其中T:DbSet
,如下所示
public interface IValidityCheck<T> where T: DbSet<T>
{
bool IsValid(Guid id, T entitySet);
}
公共接口IValidyCheck其中T:DbSet
{
bool是有效的(Guid id,T entitySet);
}
现在,在我的.net核心应用程序中,我正在尝试添加对此的依赖项。我有点像
services.AddTransient<IValidityCheck<DbSet<School>>, ValidityCheck<DbSet<School>>>();
services.AddTransient();
但我得到一个错误,比如
类型
“Microsoft.EntityFrameworkCore.DbSet”
不能用作泛型类型或方法中的类型参数“T”
“IValidityCheck”。不存在来自的隐式引用转换
“Microsoft.EntityFrameworkCore.DbSet”
到
“Microsoft.EntityFrameworkCore.DbSet>”
我知道将其更改为constraint到,其中T:class
将使其更容易,但我希望约束特定于DbSet
您有两个选项:
1) 您可能还需要一个参数。像这样:
public interface IValidityCheck<T, I> where T: DbSet<I>
公共接口IValidyCheck其中T:DbSet
然后像这样使用它:
services.AddTransient<IValidityCheck<DbSet<School>, School>, ValidityCheck<DbSet<School>,School>>();
services.AddTransient();
2) 另一种可能性是,您可以通过引入另一个接口来抽象该DbSet:
public interface IValidityCheckBase<T> where T: class
{
bool IsValid(Guid id, T entitySet);
}
public interface IValidityCheck<T> : IValidityCheckBase<DbSet<T>>
{
}
公共接口IValidyCheckBase,其中T:class
{
bool是有效的(Guid id,T entitySet);
}
公共接口IValidityCheck:IValidityCheckBase
{
}
您的示例通用实现:
public class ValidityCheck<T> : IValidityCheck<T>
{
public bool IsValid(Guid id, DbSet<T> entitySet)
{
return false;
}
}
public类ValidityCheck:IValidityCheck
{
public bool有效(Guid id,DbSet entitySet)
{
返回false;
}
}
那么它甚至应该在泛型类型用法中不声明DbSet的情况下工作,因为您希望强制它成为DbSet,这应该更简洁:
services.AddTransient<IValidityCheck<School>, ValidityCheck<School>>();
services.AddTransient();
在这里,我使用了
List
,但应该是类似的。我个人喜欢这个选择。您可以在演示中看到代码编译得很好。怎么可能不是DbSet呢?我想你需要另一个通用变量你的定义就像一个无限递归循环。公共接口IValidityCheck,其中T:DbSet和services.AddTransient()如何代码>