为泛型类型实现ninject提供程序

问题描述 投票:1回答:1

使用ninject,我想为MyRepository类创建一个提供程序,该提供程序依赖于ApplicationDbContext

public class MyRepository<TEntity> 
    where TEntity : MyBaseEntity
{
    private ApplicationDbContext _dbContext;

    public MyRepository(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    // ...
}

我看过this document,它解释了如何创建提供者,但我不确定:

  1. 如何将ApplicationDbConext参数传递给提供者
  2. 如何实例化通用类型

我不确定是否可以为泛型类型创建提供程序。如果不,有人可以显示如何使用Factory interface完成此操作吗?

这是我尝试过的:

工厂接口(我不确定是否应该定义通用工厂吗?):

public interface IMyRepositoryFactory<TEntity>
    where TEntity : MyBaseEntity
{
    MyRepository<TEntity> CreateMyRepository(ApplicationDbContext applicationDbContext);
}

工厂实现:

public class MyRepositoryFactory<TEntity> : IMyRepositoryFactory<TEntity>
    where TEntity : MyBaseEntity
{
    private readonly IResolutionRoot _resolutionRoot;

    public AdRepositoryFactory(IResolutionRoot resolutionRoot)
    {
        _resolutionRoot = resolutionRoot;
    }

    public AdRepository<TEntity> CreateMyRepository(ApplicationDbContext applicationDbContext)
    {
        // the following line has syntext error, I am not sure how to use a generic type
        return _resolutionRoot.Get<MyRepository<TEntity>>(new ConstructorArgument("applicationDbContext", applicationDbContext));
    }
}

在上面的尝试中,我定义了一个泛型工厂...可以使用这样的开放式泛型吗?

kernel.Bind<IMyRepository<>>().ToFactory();
c# dependency-injection ninject provider ninject-extensions
1个回答
1
投票

我设法为我的通用类型创建了一个提供程序:

public class MyRepositoryProvider<TEntity> : Provider<IMyRepository<TEntity>>
    where TEntity : MyBaseEntity
{
    private ApplicationDbContext _applicationDbContext;

    public MyRepositoryProvider(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    protected override IMyRepository<TEntity> CreateInstance(IContext context)
    {
        return new MyRepository<TEntity>(_applicationDbContext);
    }
}

这是绑定的样子:

kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
kernel.Bind(typeof(IMyRepository<>)).ToProvider(typeof(MyRepositoryProvider<>)).InRequestScope();
© www.soinside.com 2019 - 2024. All rights reserved.