微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将泛型类型对象传递给类构造函数

如何解决如何将泛型类型对象传递给类构造函数

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

通用类(存储库):

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'

Screenshot

如何配置我的第二个类的构造函数以接收来自 repo 通用类的对象?

解决方法

您的代码存在多个问题,但就您所关心的错误而言,DbContext 不是非抽象类型,因此您不能将它与 {{ 1}} 通用约束。它也没有实现 new()。你可以做几件事。首先是使 IDbContextFactory 通用并匹配相同的通用约束,如下所示:

UOW

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。