2013-09-18 3 views
1

Я довольно новичок в Injection Dependency, и я ищу советы по лучшим практикам. Извините, если это было задано раньше, но я пока не смог найти хорошее решение.MVC/Ninject Injection Dependency in business

Предположим, у меня есть веб-приложение MVC4 и отдельный бизнес-уровень. Приложение 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); 
     } 
    } 
} 

Что является лучшей практики для вставлять ICalculator в каждый экземпляр Widget, когда Ninject настроен в веб-приложении MVC, но объекты Widget создаются в бизнес-слое?

ответ

1

Запретить выполнение инъекции конструктора или вложение свойств в объекты. Вы должны либо:

  1. Пусть уровень услуг вызвать расчет на виджет, как это:

    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); 
    

Об этом написано много. Посмотрите на эти статьи, например:

0

Если виджет и 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>(); 
} 
+0

Нет, как виджет и хранилище находится в бизнес-уровне, поэтому мне интересно, как я мог бы привнести ICalculator экземпляр в виджет, когда виджет создается на бизнес-уровне, но настройка Ninject находится в проекте MVC. – matk

+0

Ответ отредактирован, чтобы отразить ваш ответ –

+0

Я не могу заставить это работать. Как код, который создает экземпляр виджета (в моем случае, репозиторий с использованием EF5), знает, что в проекте MVC существует ниндзетная конфигурация? Я мог видеть, как это будет работать, если бы у меня была ссылка на ядро ​​Ninject на бизнес-уровне, но из того, что я слышал, это считается плохой практикой. – matk