3

我正在尝试使用 Ninject 重用 NopCommerce 代码进行数据访问。我的问题:如何将未指定的泛型类型注入对象?我知道 NopCommerce 使用 Autofac。

我的对象描述:我有控制器(MyController),它拥有存储库(IRepository<T>)。EfRepository<T>使用 ninject 命令注入此存储库: kernel.Bind(typeof(IRepository<>)).To(typeof(EfRepository<>)). EfRepository持有 typeof ,这IDbContext是通用的DbContextEfRepository不会将其泛型类型传递给IDbContext,但仍将其注入。使用 Ninject 是如何完成的?

编码;

public class MyController : Controller
{
    //a repository --> injected as EfRepository<> using generic injection using the command:
    //kernel.Bind(typeof(IRepository<>)).To(typeof(EfRepository<>));
    private readonly IRepository<Account> _repository;
}

public class EfRepository<T> : IRepository<T> where T : BaseEntity
{
    private IDbContext _context; //<<== How do I inject <T> to IDbcontext?
}

public interface IDbContext
{
    IDbSet<T> Set<T>() where T : BaseEntity;
} 
4

1 回答 1

2

因为 IDbContext 不是通用的,您可以简单地将其注入存储库并在使用时将 T 传递给通用 Set 方法。

public class EfRepository<T> : IRepository<T> where T : BaseEntity
{
    private IDbContext context;
    public EfRepository(IDbContext dbContext)
    {
        this.context = context;
    }

    public void Do()
    {
        var dbSet = this.context.Set<T>();
    }
}
于 2012-04-13T12:20:06.383 回答