C# 如何将依赖项注入与通用dbset一起使用<;T>;

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

我有一个我希望用来执行有效性检查的接口,就像将id传递给方法一样简单,它应该返回true或false,无论该实体是否存在。我不希望每个存储库都有这个实现,所以我创建了一个单独的接口
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()如何