业务层中的MVC / Ninject依赖注入

时间:2013-09-18 13:31:56

标签: asp.net-mvc asp.net-mvc-4 dependency-injection

我对依赖注入很新,我正在寻找一些关于最佳实践的建议。很抱歉,如果之前有人问过,但我还没有找到一个好的解决方案。

假设我有一个MVC4 Web应用程序和一个单独的业务层。 MVC应用程序已经使用Ninject NuGet包设置,所以我有NinjectWebCommon,它工作正常。

我的问题是:当我需要在其他图层中设置依赖项时,如何使用Ninject?

假设我有这个存储库:

public class WidgetRepository : IWidgetRepository
{
    // using an entity framework db context.
    WidgetDbContext context = new WidgetDbContext();

    public IQueryable<Widget> Widgets
    {
        get
        {
            return context.Widgets;
        }
    }
}

存储库返回的每个窗口小部件都需要使用我需要注入的计算器对象执行计算:

public class Widget
{
    // how can I get Ninject to inject a calculator object 
    // when Widgets are loaded form the database?

    public ICalculator calculator;

    public int MyValue { get; set; }

    public int CalculateSomething
    {
        get
        {
            return calculator.Calculate(MyValue);
        }
    }
}

在MVC Web应用程序中设置Ninject但是在业务层中创建Widget对象时,将ICalculator注入每个Widget实例的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

防止在实体中进行构造函数注入或属性注入。你应该:

  1. 让服务层调用Widget上的计算,如下所示:

    var widget = this.repository.GetById(wigditId);
    var value = this.calculator.Calculate(widget.MyValue);
    
  2. 或者在构造中使用构造函数注入:

    var widget = this.repository.GetById(wigditId);
    var value = widget.CalculateSomething(this.calculator);
    
  3. 关于这一点已经写了很多。例如,看看这些文章:

答案 1 :(得分:0)

如果Widget和ICalculator在同一个项目中,只需使用构造函数注入:

public class Widget
{
    public Widget(ICalculator calculator)
    {
      _calculator = calculator;
    }

    private ICalculator _calculator;

    public int MyValue { get; set; }

    public int CalculateSomething
    {
        get
        {
            return _calculator.Calculate(MyValue);
        }
    }
}

在NinjectWebCommon中,您需要注册ICalculator实现,如下所示:

private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<ICalculator>()
              .To<Calculator>();
}