2017-10-13 21 views
2

我有一个接口我希望用来执行有效性检查,就像传入一个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

+0

T怎么可能是DbSet ?我认为你需要另一个通用变量 –

+0

你的定义就像一个无限递归循环。 'public interface IValidityCheck where T:DbSet 'and'services.AddTransient ,School>,ValidityCheck ,School >>();' –

回答

2

你有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)选项。你会发现代码在演示中编译得很好。