C# 对依赖注入感到困惑吗
我有一个工作类单元,其中包含一个ExpressionRepository。我想用接口(IExpressionRepository)替换它,并用Ninject将其绑定到ExpressionRepository,但问题是:我的ExpressionRepository需要一个DbContext作为构造函数参数,但据我所知,您无法在接口中定义构造函数,所以我不能在不使用具体实现的情况下调用这个构造函数 以下是目前的代码,不使用接口:C# 对依赖注入感到困惑吗,c#,asp.net,asp.net-mvc,inversion-of-control,ninject,C#,Asp.net,Asp.net Mvc,Inversion Of Control,Ninject,我有一个工作类单元,其中包含一个ExpressionRepository。我想用接口(IExpressionRepository)替换它,并用Ninject将其绑定到ExpressionRepository,但问题是:我的ExpressionRepository需要一个DbContext作为构造函数参数,但据我所知,您无法在接口中定义构造函数,所以我不能在不使用具体实现的情况下调用这个构造函数 以下是目前的代码,不使用接口: private DbContext _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)”的方法,但是有更好的方法吗?您的问题并不完全清楚,但如果问题是您无法在设置DI容器的位置设置
DbContext
(因此不能直接注入IExpressionRepository
),那么解决方案是注入工厂:
public interface IExpressionRepositoryFactory
{
IExpressionRepository Create(string someIdentifier);
}
这里,someIdentifier
是设置DbContext
所需的任何信息(例如连接字符串,或者更好的是,可以映射到工厂内的连接字符串的一些独立于实现的ID)。如果知道不需要该参数,可以完全忽略该参数(例如,您只需要读取一个配置文件)
然后,将工厂注入到需要存储库的任何类中,并可以根据需要指定someIdentifier
通常,您接下来要做的是将存储库传递(注入)到工作单元中,因此UoW不直接依赖于DbContext
,只使用“存储库拥有的任何机制”,无论是DbContext
、SqlClient
还是其他ORM
如果您习惯于始终使用DbContext
,那么您可以只执行以下操作—但这意味着任何存储库实现都必须始终返回到DbContext
:
IExpressionRepository Create(DbContext context);
Bind<DBContext>().ToSelf().InRequestScope();
Bind<IExpressionRepository>().To<ExpressionRepository>();
这仍然将
IExpressionRepository
本身与DbContext
类分离,而不是工厂接口。如果您不想使用@Ant p提到的工厂方法,请使用方法绑定:
Bind<IExpressionRepository>().ToMethod(context => new ExpressionRepository(GetMyDbContext()));
看看这个问题,我想它有相同的方法: