2015-01-02 2 views
1

У меня есть основы, связанные с разрешающими зависимостями контроллера с Autofac + MVC5. Тем не менее, мне интересно, как вводить зависимости в сервисы.Autofac + MVC5: разрешение зависимостей службы

Учитывая примерное определение как таковое, как я могу создать/получить экземпляр экземпляра класса с Autofac, разрешающим необходимые зависимости?

Bar : IBar 
{ 

    Public Bar(IFoo foo, IPanda panda) 

{} 


} 
+0

Есть несколько шагов (http://docs.autofac.org/en/latest/integration/mvc.html) для интеграции Autofac в MVC. Где вы застряли? – Win

+0

У меня встроенный Autofac; Мне интересно, как вводить зависимости в объекты, которые не являются контроллерами. –

+0

Например, вводят Службу C с услугами A и B, поэтому C может делать свое дело. –

ответ

1

В конечном счете это сводится к регистрации типа в контейнере. Такие как:

var builder = new ContainerBuilder(); 
builder.RegisterType<Bar>().As<IBar>(); 
var container = builder.Build(); 

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

Есть несколько различных способов регистрации и настроить зависимости, времена жизни, перехватчиков и т.д., подробнее здесь: http://docs.autofac.org/en/latest/register/registration.html

После того, как все регистрируется, когда Autofac пытается создать экземпляр контроллера, он будет инспектировать конструктор вашего контроллера , и когда он найдет IBar в качестве зависимости, он будет искать свою регистрацию контейнера и соответствующим образом создавать экземпляр.

То же самое применимо, когда он пытается создать экземпляр IBar, он будет замечать IFoo и IPanda и повторить тот же процесс.

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

Таким образом, в конце концов, все это будет прикован таким образом, зависимости создаются по мере необходимости. Я стараюсь не использовать стиль создания экземпляра ServiceLocator, запрашивая зависимость напрямую и просто позволяя Autofac предоставлять зависимости во время построения.

+0

Большое спасибо !! Это помогло очистить блок в моем сознании. Мне все равно придется называть «DependencyResolver.Current.GetService ();» чтобы получить копию сервиса, но все переданные службы конструктора будут создаваться автоматически. Я делаю экземпляр экземпляров самих классов, но не на самом деле через интерфейсы, которые они реализуют. Это сильно очистит мой код. :) –

+1

Ну, вам необязательно вызывать DependencyResolver. Я имею в виду, если ваш контроллер имеет зависимость от IBar, тогда он будет предоставлен автоматически, не нужно вызывать GetService. То же самое относится к любой цепочке зависимостей. Обычно мне удается создать все приложение без ручного вызова GetService, что будет способом ServiceLocator. –

+1

Я смог очистить свой код от множества «GetService», когда существенно изменил дизайн. Спасибо за совет :) –

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