我有一个工作单元,它包含一个ExpressionRepository。我想用接口(IExpressionRepository)替换它并用Ninject将它绑定到ExpressionRepository,但问题在于:我的ExpressionRepository需要一个DbContext作为构造函数参数,但是你不能在一个构造函数中定义一个构造函数。据我所知,接口我不能使用具体的实现来调用这个构造函数。
这里是现在的代码,不使用界面:
private DbContext _dbContext;
private ExpressionRepository _expressionRepository;
public UnitOfWork(DbContext dbContext)
{
_dbContext = dbContext;
}
public ExpressionRepository ExpressionRepository
{
get { return _expressionRepository ?? (_expressionRepository = new ExpressionRepository(_dbContext)); }
}
我最好的猜测是添加类似' void setDataSource(Object dataSource)'到我的界面,但有更好的方法吗?
答案 0 :(得分:0)
您的问题并不完全清楚,但如果问题是您无法在设置DI容器的位置设置DbContext
(因此无法注入{直接{1}},然后解决这个问题就是注入一个工厂:
IExpressionRepository
在这里,public interface IExpressionRepositoryFactory
{
IExpressionRepository Create(string someIdentifier);
}
是设置someIdentifier
所需的任何信息(例如,连接字符串,或者更好的是,某些与实现无关的ID,您可以映射到工厂内的连接字符串)。如果您知道不需要它,可以完全省略该参数(例如,您只是要读取配置文件)。
然后,将 factory 注入需要存储库的任何类中,您可以根据需要指定DbContext
。
通常你要做的就是将你的存储库传递(注入)到工作单元,因此UoW不直接依赖于someIdentifier
而只是使用“存储库具有的任何机制”,这是一个DbContext
,一个DbContext
或其他一些ORM。
如果您对总是拥有SqlClient
感到满意,那么您可以执行以下操作 - 但这意味着任何存储库实现都必须返回到DbContext
:
DbContext
这仍然将IExpressionRepository Create(DbContext context);
本身与IExpressionRepository
类解耦 - 而不是工厂界面。
答案 1 :(得分:0)
如果您不想使用@Ant P提及的工厂方法,请使用方法绑定:
Bind<IExpressionRepository>().ToMethod(context => new ExpressionRepository(GetMyDbContext()));
或者,您可以使用ExpressionRepository
类在其构造函数中将DBContext
作为参数的常规绑定,并绑定您的DBContext
:
Bind<DBContext>().ToSelf().InRequestScope();
Bind<IExpressionRepository>().To<ExpressionRepository>();
看看这个问题,我猜它有相同的方法: