2016-03-21 5 views
4

Я экспериментирую с IoC в своем веб-приложении и хочу делать вещи в соответствии с лучшими практиками. Недавно я обнаружил структуру IoC под названием DryIoc, которая должна быть небольшой и быстрой.Где положить контейнер?

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

Должно ли оно находиться в контроллере? Или в Global.asax? Где-то еще может быть? Или, возможно, как статическая переменная в классе?

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

var container = new Container(); // Should obviously NOT be a local variable 

container.Register<ISalesAgentRepository, SalesAgentRepository>(Reuse.Singleton); 
+2

Вам необходимо использовать контейнер в [корневом составе] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/). –

+1

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

+2

В отличие от других комментариев и ответов здесь, я бы рекомендовал вам [не использовать контейнер DI вообще] (http://blog.ploeh.dk/2014/06/10/pure-di). Это принесет пользу, что вы узнаете основные шаблоны лучше, и вы не столкнетесь с какой-то неудобной проблемой API. –

ответ

2

Обычно я делаю следующее:

1 - Создание загрузчика класса

public static class Bootstrapper { 
    public static Container _container; 
    public void Bootstrap() { 
     var container = new Container; 
     // TODO: Register all types 
     _container = container; 
    } 
    public static T GetInstance<T>() { 
     return _container.Resolve<T>(); 
    } 
} 

2 - Вызов метода начальной загрузки в global.asax, в методе Application_Start:

protected void Application_Start() { 
    Bootstrapper.Bootstrap(); 
} 

И никогда не используйте контейнер в любом месте прямо, вы должны подключить его где-нибудь в жизненном цикле MVC, Обычно пакет DI, который вы используете, может сделать это для вас.

Также обратите внимание, что я добавил метод GetInstance<T> к классу bootstrapper. Этот метод позволяет использовать контейнер напрямую, запрашивая экземпляры типов. Я добавил этот метод, чтобы вы знали, что это возможно, , но всегда используйте конструктор-инъекцию, если возможно.

+0

Maartn вы можете удалить метод GetInstance, пожалуйста :) Большинство людей, у которых новые пользователи будут использовать его, и они разрешат его оттуда. Помимо этого вы можете поместить метод, который возвращает новый lifetimecope. –

+2

Точно, как я это делаю, но я буду использовать WebActivator вместо того, чтобы загрязнять глобальный asax больше, чем я вынужден. –

1

На самом деле, вам может не понадобиться хранить контейнер на вашей стороне. Вот DryIoc WebApi Owin sample.

Расширение DryIoc.WebApi будет хранить и удалять контейнер, когда он подходит в реализации IDependencyResolver.

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