1

Я понимаю DI и IoC, но я не могу понять, как реализовать его в приложении nTier. Это простое приложение MVC, которое я пытаюсь создать с помощью одного объекта домена.Понимание инъекции зависимостей, IoC в приложении MVC nTier

Слои: DAL и UI будут ссылаться на слой BLL. ДАЛ < --BLL -> Пользовательский интерфейс

ДАЛ будет содержать EntityFramework, SQLBlogRepository, Blog.cs и Mapper BAL будет содержать IBlogRepository, объект домена: Blog.cs интерфейс будет реализовывать Конструктор DI из IBlogRepository

Здесь я застрял. Как я могу использовать Ninject, чтобы конструктор знал, что используется реализация SqlBlogRepository? Я также столкнулся с несколькими примерами, в которых используется «Корень композиции», который добавляет больше путаницы. Тогда есть пример, который использует шаблон хранилища. Суть в том, что я пытаюсь реализовать приложение nTier MVC, которое свободно соединяется и использует IoC/Dependency Injection. Пожалуйста, помогите мне наметить, как я могу сделать вызов с уровня пользовательского интерфейса, и вернуть данные DAL-слоя через слой BLL, пока все три слоя слабо связаны.

+1

вы смотрели на [архитектуры лука ] (http://jeffreypalermo.com/blog/the-onion-architecture-part-1 /)? Поместите ваши зависимости, то есть DAL, другую инфраструктуру снаружи и введите их в ядро ​​(домен/BLL). Это тоже нашло: http://www.codeproject.com/Articles/808400/Onion-Architecture-in-ASP-Net-MVC –

+0

Спасибо, Марк К. Я обязательно прочитаю о архитектуре лука и посмотрю на пример. Я очень ценю это. – zXSwordXz

ответ

0

Я предполагаю, что у вас нет файла конфигурации ninject. Итак, вот как мы это сделали, где я нахожусь.

Чтобы объяснить, что я делаю. Вам нужно, чтобы ваш конкретный класс реализовал любой интерфейс, который вы хотите использовать.

В файле конфигурации ninject вам необходимо привязать свои интерфейсы к вашим конкретным классам. Затем вы можете вызвать ninject, чтобы получить свои интерфейсы, и он вернет конкретный класс, который вы хотите.

Если вы хотите использовать это в среде разработки N-уровня.

< DAL -> BL < -> UI

Мы застряли Ninject конфигурации в БЛ. Так как Bl - единственный слой, который ссылается на DAL. Мы разоблачили интерфейсы DAL/конкретные классы BL по ссылкам. Затем в BL мы добавили конфигурацию Ninject.

Как только это было сделано в пользовательском интерфейсе, мы смогли получить доступ ко всем объектам Business.

ninject starter tutorial

ДАЛ

public interface IRepository 
{ 
    //does some things 
} 

public SQLBlogRepository : IRepository 
{ 
//implements IRepository 
} 

BL

Ninject КОНФИГУРАЦИИ ФАЙЛ

public Foo : IFOO 
{ 
    public Foo(IRepository steve){} 
} 

public interface IFOO 
{ 
} 

public class NinjectConfig : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IRepository>.To<SQLBlogRepository>(); 
     Bind<IFOO>.To<Foo>(); 
    } 
} 

тогда вы используете его так.

var repo = new StandardKernel(new NinjectConfig()).Get<IRepository>(); 
var fooManager = new StandardKernel(new NinjectConfig()).Get<IFOO>(); 

var fooManager, через силу Ninject будет autoInstantiate вашего репозитория. Поэтому вам не нужно создавать его самостоятельно. Конфигурационный файл будет обрабатывать все зависимости в конструкторе. Поэтому вам никогда не нужно знать, какие конструкторские творения вам нужно делать.И вы также можете изменить творения в одном месте и автоматически распространять его через свой код.

+0

Спасибо, завтра я собираюсь попробовать этот подход завтра. Быстрый вопрос, поэтому мне больше не нужно передавать IRepository в свой конструктор контроллера? – zXSwordXz

+0

Правильно, Ninject рассмотрит конструкторы в вашем конкретном классе, которые вы связали с нагрузкой. Если он видит параметры в конструкторах, что у него есть привязка, он автоматически создает экземпляр этого объекта и передает его. – gh9

0

В вашем примере пользовательский интерфейс (проект Mvc) является вашим корнем композиции, и вы можете настроить его в нем (с любым контейнером ioc, например, ninject). Ваш проект mvc должен иметь reflence для BLL и DAL слоя, и вы должны сделать отображение как @ gh9 ответ в вашем MVC project.in контроллера у вас есть

public class HomeController : Controller 
{ 
    private readonly IFOO _fooBll; 
    public HomeController(IFOO fooBll){ 
    _fooBll=fooBll; 
    } 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

и вы должны иметь контроллер завода, чтобы устранить контроллер dipendency как:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel ninjectKernel; 

public NinjectControllerFactory() 
{ 
    ninjectKernel = new StandardKernel(); 

} 

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
{ 
    return controllerType == null 
       ? null 
       : (IController) ninjectKernel.Get(controllerType); 
} 


} 
+0

Теперь я немного настроен. Вы говорите, что в дополнение к файлу конфигурации Ninject мне также нужно внедрить фабрику контроллеров? – zXSwordXz

+0

Я бы предположил, что ваш слой mvc должен ** не ** иметь жесткую ссылку на ваш DAL, иначе все, что вы сделали, - это разделить проект вверх. – Eonasdan

+0

@zXSwordXz, если вы хотите ввести свой контроллер dipandency yo, необходимо использовать контроллер factory –

Смежные вопросы