Является ли это хорошим примером "противозачаточной инъекции ублюдка"?
Я вижу, как ведущие разработчики пишут такой код и читают книгу Марка Семанна "Инъекция зависимостей в .NET". Мне интересно, является ли конкретное "новое" "чужим", таким образом, "Bastard Injection"??
public class SessionInitServiceManager
{
protected readonly ICESTraceManager _traceManager;
protected readonly ILogger _logger;
protected readonly IAggregateCalls _aggregator;
protected readonly IMultiCoreRepository _repository;
public SessionInitServiceManager(ICESTraceManager traceManager,
ILogger logger,
IAggregateCalls aggregator,
IMultiCoreRepository repository)
{
_traceManager = traceManager;
_logger = logger;
_aggregator = aggregator;
_repository = repository;
}
public SessionInitServiceManager() : this(new CESTraceManager(),
new Logger("BusinessServices.authenticateUser"),
new Aggregator(),
new RepositoryFactory().BuildMultiCoreRepository()) { }
Ответы
Ответ 1
Это наверняка выглядит как классический пример Bastard Injection. Причина в том, что у вас есть то, что появляется как четыре иностранных по умолчанию. Foreign Default - это значение по умолчанию, в котором тип поступает из другого модуля/проекта/DLL. Я бы пропил включить пространство имен в это определение, потому что пространства имен могут обозначать границы, в которых в будущем вы делаете прорыв в свой собственный модуль. Это больше напоминает об этом, когда вы решите использовать локальный по умолчанию (я бы разделил это на свой собственный модуль в будущем?).
То, как это не было бы Bastard Injection, будет заключаться в том, что все эти классы живут в одном модуле. Дело в том, что это так плохо, потому что вы перетаскиваете зависимости, и теперь ваш класс тесно связан с этими классами. Если я захочу использовать свою собственную версию ведения журнала, я должен взять с собой DLL для ведения журнала и т.д., Даже если я не использую, что отрицает преимущества модульного дизайна приложения.
Ответ 2
Мне довелось заимствовать эту книгу, инъекцию зависимости в .NET от друга. Я вижу, что вы говорите. Я верю, что это "ублюдка". Это жестокий термин, но я полагаю, что после ColdFusion (кашель) имеет тег "CFABORT" как часть языка.
Кроме того, я заметил хорошую статью, сообщение в блоге Как не делать инъекции зависимостей - статический или одноэлементный контейнер.
В принципе, прежде чем мы начнем, позвольте получить что-то в стороне:
Инъекция зависимостей!= Использование контейнера IoC "
Вот кикер: "Это рождение статического контейнера. Вместо того, чтобы изменять конструктор контроллера, чтобы принять зависимость, мы просто меняем строку, в которой создается экземпляр службы, чтобы разрешить ее, используя контейнер."
public class HomeController
{
private readonly IExampleService _service;
public HomeController()
{
_service = Container.Instance.Resolve<IExampleService>();
}
public ActionResult Index()
{
return View(_service.GetSomething());
}
}