使用ninject,我想为MyRepository
类创建一个提供程序,该提供程序依赖于ApplicationDbContext
:
public class MyRepository<TEntity>
where TEntity : MyBaseEntity
{
private ApplicationDbContext _dbContext;
public MyRepository(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
// ...
}
我看过this document,它解释了如何创建提供者,但我不确定:
ApplicationDbConext
参数传递给提供者我不确定是否可以为泛型类型创建提供程序。如果不,有人可以显示如何使用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();
我设法为我的通用类型创建了一个提供程序:
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();