【问题标题】:How to pass a generic type object to a class constructor如何将泛型类型对象传递给类构造函数
【发布时间】:2021-02-10 15:57:11
【问题描述】:

我有一个通用类将扮演存储库角色,我还有第二个类,第二个类应该在构造函数中从通用存储库接收一个对象。

通用类(存储库):

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 类型似乎缺少空构造函数。而且它没有实现IDbContextFactory
  • 解决此问题的任何解决方案或建议
  • DbContext 不是非抽象类型,因此您不能将其与new() 通用约束一起使用。它也没有实现IDbContextFactory
  • 声明无参数构造函数并实现IDbContextFactory。但对我来说,它似乎更像是XY problem 的一个例子。你为什么要它有这个属性?
  • 另外,请不要张贴代码/错误信息的图片,在以后的问题中包含实际内容。

标签: c# generics repository unit-of-work


【解决方案1】:

您的代码存在多个问题,但要解决您在此处关注的错误,DbContext 不是 非抽象类型,因此您不能将其与 new() 泛型一起使用约束。它也没有实现IDbContextFactory。你可以做几件事。首先是使UOW 通用并匹配相同的通用约束,如下所示:

class UOW<TContext> : IUOW
    where TContext : DbContext, IDbContextFactory<TContext>, new()
{
    public UOW(Repo<TContext> repo)
    {
    }
}

第二个是使用一个可以处理所有这些约束的具体类,例如:

class MyContext : DbContext, IDbContextFactory<MyContext>
{
    public MyContext CreateDbContext()
    {
        throw new NotImplementedException();
    }
}

class UOW : IUOW
{
    public UOW(Repo<MyContext> repo)
                 // ^^^^^^^^^ Use the new object here
    {
    }
}

【讨论】:

  • 但是我有一个问题,你说我的代码有多个问题,请问你是指我所要求的问题,还是我有问题的问题在我的班级和他们的结构问题?并接受我的尊敬,先生
  • 嗯,这是一个不同的问题,对于不同的网站来说。但是,一开始我不会让上下文实现 IDbContextFactory,这会混淆太多东西,将它们作为单独的对象保留更有意义。
  • 真的很感谢您,先生,您是金人,上帝保佑您,先生,您可以在您的允许后将您在社交媒体上的任何帐户提供给我,以便与您联系,再次感谢您。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多