对依赖注入感到困惑

时间:2014-05-03 14:11:57

标签: c# asp.net asp.net-mvc inversion-of-control ninject

我有一个工作单元,它包含一个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)'到我的界面,但有更好的方法吗?

2 个答案:

答案 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>();

看看这个问题,我猜它有相同的方法:

How to handle DBContext when using Ninject