В настоящее время я немного пытаюсь понять, как я могу использовать шаблон инъекции зависимостей вне классов моего контроллера.Взаимодействие с многоуровневым приложением
Скажем, например, что у меня есть следующий контроллер:
public class TestController : Controller {
ILog logger;
public TestController(ILog log) {
logger = log;
}
public string TestMethod() {
businessLayer businessLayer = new businessLayer();
return businessLayer.DoSomethingAndLogIt();
}
}
Я понимаю, что в большинстве случаев это не представляется возможным использовать внедрение конструктора вне контроллера классов. Таким образом, было бы невозможно напрямую использовать ILog-внедрение insdie класса «businesslayer».
Одно простое решение, которое я мог себе представить, заключается в следующем:
public class TestController : Controller {
ILog logger;
public TestController(ILog log) {
logger = log;
}
public string TestMethod() {
businessLayer businessLayer = new businessLayer(logger);
return businessLayer.DoSomethingAndLogIt();
}
}
Так переходя на зависимостях от контроллера до нижележащих слоев. Но это лучший способ? Существуют ли более эффективные решения для того, чтобы мой доступ к классу businessLayer к реализации ILog?
Thx!
Thx! Одна вещь, которую я не понимал, - это то, как IBusinessLayer будет использовать реализацию ILog. Но большинство DI-контейнеров, похоже, могут решить это при регистрации. http://simpleinjector.readthedocs.org/ru/latest/using.html#automatic-constructor-injection-auto-wiring – mhtsbt
@Matthias: Это не касается контейнеров DI.Каждый класс должен просто принимать зависимости, которые он (непосредственно) нуждается в качестве аргументов конструктора, а в пути запуска приложения вы создаете полный графический объект (ы) ([Корень композиции] (http://blog.ploeh.dk/ 2011/07/28/CompositionRoot /)). Для этого вам не нужен контейнер DI, и он может даже иметь преимущества, чтобы не использовать контейнер вообще. С другой стороны, контейнер DI может помочь сделать ваш корневой состав намного более удобным. – Steven