2016-01-17 3 views
0

Я прочитал несколько статей о том, нужно ли выполнять интенсивные операции с ресурсом в конструкторе. Некоторые из них говорят, что если это не влияет на SRP или Testability, тогда это нормально. Я хочу получить мнение о наилучшей практике для этого сценария.Autofac, инициализируя контейнер в конструкторе

Я следую принципу принципа корневого принципа, упомянутому here в моем проекте ASP.Net WebApi2, и мои контроллеры имеют введенные им зависимые объекты. Вместо того, чтобы вводить только несколько зависимостей, я хочу ввести весь контейнер и получить любую из зависимостей. У меня есть этот класс, где я настраиваю свойство контейнера в конструкторе. Я не знаю, относится ли это к плохой практике.

public class AppContainer : IAppContainer 
{ 
    private readonly ContainerBuilder _builder ; 
    private IContainer _container ; 

    public AppContainer() 
    { 
     _builder = new ContainerBuilder(); 
     _builder.RegisterAssemblyModules(_assembly); 

     _container = _builder.Build(); 
    } 

    public ContainerBuilder ContainerBuilder 
    { 
     get { return _builder; } 
    } 

    public IContainer Container 
    { 
     get { return _container;} 
    } 

} 

Является ли это плохой дизайн, чтобы вызвать .Build() в конструкторе, как это сделано выше? Я хочу сделать это так, чтобы свойства AppContainer были инициализированы во время создания экземпляра и не ожидали вызова какого-либо метода для сохранения значений.

Теперь в мой контроллер, вместо того, что-то вроде этого

public class HomeController : ApiController 
{ 
    private readonly IBusiness _bus; 

    public HomeController(IBusiness bus) 
    { 
     _bus = bus; 
    } 

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

public class HomeController : ApiController 
{ 
    private readonly IAppContainer _container; 

    public HomeController (IAppContainer container) 
    { 
     _container = container; 
    } 
+0

Я не вижу в этом никаких проблем –

ответ

1

Является ли это плохой дизайн, чтобы вызвать .build() в конструкторе, как это сделано выше?

В общем, не рекомендуется делать много в конструкторах.

Кроме того, я не рекомендую использовать класс AppContainer. Вы просто обертываете контейнер классом AppContainer и используете его как локатор обслуживания which is an anti-pattern.

Ваши классы должны явно объявлять свои зависимости в конструкторе, как в вашем первом примере HomeController.

Если вы проектируете свои классы с учетом SOLID principles, то ваши классы будут небольшими и не требуют много зависимостей, поэтому вам почти не придется добавлять новые зависимости.

Обратите внимание, что наличие слишком большого количества зависимостей (> ~ 3) может быть признаком того, что вы нарушаете принцип единой ответственности and is considered a code smell.

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