C# 对依赖注入感到困惑吗

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;

我有一个工作类单元,其中包含一个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)”的方法,但是有更好的方法吗?

您的问题并不完全清楚,但如果问题是您无法在设置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()));
看看这个问题,我想它有相同的方法: