我看到首席开发人员编写这样的代码并阅读了Mark Seemann的书" .NET中的依赖注入" 我想知道具体的& #34;新"是"外国",因此" 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()) { }
答案 0 :(得分:9)
这肯定看起来像是Bastard Injection的典型例子。原因是因为你有四个外部默认值。 Foreign Default是指默认值,其中类型来自不同的模块/项目/ DLL。我将propyl包含在该定义中的命名空间,因为名称空间可以表示边界,在未来的点上,您可以突破到其自己的模块中。当您决定使用本地默认值时,我会更加注意这一点(将来我会将其拆分为自己的模块吗?)。
这不是Bastard Injection的方式是所有这些类都存在于同一个模块中。使这个如此糟糕的事情是因为你拖动了依赖关系,现在你的类与这些类紧密耦合。如果我选择使用我自己的日志记录版本,我必须使用DLL进行日志记录等,即使我不使用,也否定了模块化应用程序设计的好处。
答案 1 :(得分:0)
我碰巧从朋友那里借了那本书,依赖注入.NET。我明白你在说什么。我相信这是“混蛋注射”。这是一个残酷的术语,但我认为在所有ColdFusion(咳嗽)都有一个“CFABORT”标签作为语言的一部分之后适合。
另外,我注意到一篇好文章,博客文章 How not to do dependency injection - the static or singleton container 。
基本上,在我们开始之前,让我们先解决一些问题:
依赖注入!=使用IoC容器“
这是踢球者,“这是静态容器的诞生。我们只是更改实例化服务的行,而不是更改控制器的构造函数以取代它,而是使用容器来解决它。“
public class HomeController
{
private readonly IExampleService _service;
public HomeController()
{
_service = Container.Instance.Resolve<IExampleService>();
}
public ActionResult Index()
{
return View(_service.GetSomething());
}
}