Инъекции зависимости MVC - PullRequest
1 голос
/ 23 декабря 2011

Я начинаю новый проект с использованием MVC4 и хотел бы использовать внедрение зависимостей.Я не использовал его в прошлом, но сейчас, похоже, самое время его использовать.

Может кто-нибудь сказать мне, какие инструменты DI теперь поддерживают MVC4, а какие предлагают наиболее легкую настройку.Мне нужно довольно просто, так как проект маленький.Самым важным для меня является система, которую легко изучить и настроить.

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Я успешно использовал пакет Ninject.MVC3 NuGet в проекте MVC 4 Beta.

// Global.asax.cs

public static void Configure(HttpConfiguration config)
{
    var kernel = new StandardKernel();
    RegisterServices(kernel);

    // For ApiControllers
    config.ServiceResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));

    // For Controllers
    DependencyResolver.SetResolver(
        t => kernel.TryGet(t),
        t => kernel.GetAll(t));
}

public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IRepository>().To<Repository>();
}

protected void Application_Start()
{
    ...

    Configure(GlobalConfiguration.Configuration);
}
2 голосов
/ 23 декабря 2011

Я не знаю MVC 4 (у меня просто еще не было возможности поиграть с ним), но я бы порекомендовал Ninject в качестве DI-контейнера. Вероятно, вы можете просто установить проект Ninject MVC3 (из nuget) в своем решении, и он вполне может просто работать с MVC4 Если не использовать:

DependencyResolver.SetResolver(new NinjectDependencyResolver(myKernal));     

о котором здесь писали http://blogs.microsoft.co.il/blogs/gilf/archive/2010/10/17/dependency-injection-in-mvc-3-was-made-easier.aspx

сообщение в блоге относится к единице, но для Ninject это почти то же самое, реализуем Dependancy Resolver, чтобы обернуть ninject и поместить его в файл global.ascx

0 голосов
/ 25 января 2012

По какой-то причине Ninject с использованием NinjectDependencyResolver не работал для меня с MVC4 (предварительный просмотр).

Я решил эту проблему, используя другую перегрузку SetResolver, приняв две анонимные функции для разрешения зависимостей.

IKernel kernel = new StandardKernel();    
kernel.Bind<...>().To(...);
DependencyResolver.SetResolver( t => kernel.Get(t), t => kernel.GetAll(t) );
...