Class 存储库模式中的映射错误

Class Mapping Error in repository pattern

我正在尝试在 EF Core 5 之上实现存储库模式。

我以这种方式定义了存储库及其接口:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()
{
    protected readonly DbContext DbContext ;

    public Repository(DbContext dbContext)
    {
        DbContext = dbContext;
    }

    public IQueryable<TEntity> GetAll()
    {
        try
        {
            return DbContext .Set<TEntity>();
        }
        catch (Exception ex)
        {
            throw new Exception($"Couldn't retrieve entities: {ex.Message}");
        }
    }
    ....
}

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
}

现在我正在尝试创建一个 DataManager 以便使用注入实例化存储库并查询数据库,如下所示:

public class BaseController : ControllerBase
{
   protected readonly DataManager dataManager;

    [HttpGet]
    public async Task<ActionResult> DoSomething()
    {
         Repository<MyEntity> entities= dataManager.GetRepository<MyEntity>();
         return Ok(entities.GetAll().Where(w=>w.EntityId>123));
    }
}

我试过像下面这样实现 DataManager:


public class DataManager : IDisposable 
{

    // keep one EFCore context per instance
    private DbContext ctx;


    public DataManager()
    {
        // create instance of context when DataManager is created
        ctx = new DbContext();
    }


    /// <summary>
    /// Dispose context if DataManager is disposed
    /// </summary>
    public void Dispose()
    {
        ctx.Dispose();
    }

    public Repository<TEntity> GetRepository<TEntity>()
    where TEntity : class
    {
        Repository<TEntity> service = null;

        var RepoName = "AuthenticationServer.Models.Repositories." + typeof(TEntity).Name + "Repository";
        try
        {
            var type = Type.GetType(RepoName);
            service = (Repository<TEntity>)Activator.CreateInstance(type, ctx);
        }
        catch (Exception e)
        {
            //default generic repo
            service = new Repository<TEntity>(ctx);
        }
        return service;
    }

}

但我在 public Repository GetRepository() 和 TEntity 上收到以下错误:

TEntity must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TEntity' in the generic type or method Repository

我该如何解决? 我想我在存储库模式中遗漏了一些东西

这是你对 Repository<TEntity>

的类型限制
Repository<TEntity> : IRepository<TEntity> where TEntity : class, new()

应该符合 GetRepository 的类型限制,但不符合。

public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class

试试这个:

public Repository<TEntity> GetRepository<TEntity>()
where TEntity : class, new()

您的代码认为您可以使用没有无参数构造函数的类型调用 GetRepository。但是 Repository 自己坚持认为必须如此。