问题描述
我有一个泛型类将扮演存储库角色,我有第二个类,第二个类应该从构造函数中的泛型存储库接收一个对象。
通用类(存储库):
public sealed class Repo<TContext> : IRepo<TContext>,Idisposable where TContext : DbContext,IDbContextFactory<TContext>,new()
{
#region properties
/// <summary>
/// Private DBContext property
/// </summary>
private DbContext _Context { get; } = null;
/// <summary>
/// Determine if Lazy Loading either activate or not
/// </summary>
private bool _LazyLoaded { get; set; }
#endregion
#region Construcors
public Repo(bool LazyLoaded)
{
_Context = new TContext();
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
public Repo(DbContext context,bool LazyLoaded)
{
_Context = context;
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
public Repo(IConfiguration configuration,string connectionString,bool LazyLoaded)
{
_Context = new TContext().GetInstance(configuration,connectionString);
_LazyLoaded = LazyLoaded;
_Context.ChangeTracker.LazyLoadingEnabled = LazyLoaded;
}
#endregion
}
我在第二堂课上的尝试:
class UOW:IUOW
{
public UOW(Repo<DbContext> repo)
{
}
public void Commit()
{
}
public void RollBack()
{
}
}
但是我遇到了这两个错误:
CS0311 类型“Microsoft.EntityFrameworkCore.DbContext”不能用作泛型类型或方法“Repo”中的类型参数“TContext”。没有从“Microsoft.EntityFrameworkCore.DbContext”到“Microsoft.EntityFrameworkCore.IDbContextFactory
CS0310 'DbContext' 必须是具有公共无参数构造函数的非抽象类型,以便将其用作泛型类型或方法 'Repo' 中的参数 'TContext'
如何配置我的第二个类的构造函数以接收来自 repo 通用类的对象?
解决方法
您的代码存在多个问题,但就您所关心的错误而言,DbContext
不是非抽象类型,因此您不能将它与 {{ 1}} 通用约束。它也没有实现 new()
。你可以做几件事。首先是使 IDbContextFactory
通用并匹配相同的通用约束,如下所示:
UOW
第二种是使用一个可以处理所有这些约束的具体类,例如:
class UOW<TContext> : IUOW
where TContext : DbContext,IDbContextFactory<TContext>,new()
{
public UOW(Repo<TContext> repo)
{
}
}