【发布时间】:2011-05-23 00:53:27
【问题描述】:
我喜欢依赖注入的构造函数注入。它强制从类型中明确声明关注点,并有助于可测试性。
我喜欢构造函数注入,在大多数地方...
以日志为例,我不喜欢它。如果我有一个许多其他类继承自的基类,并且我希望所有这些类都使用我的 ILogger 的实例(或其他),并且我不想要静态工厂(Logger.Instance)......我不想在每个接受 ILogger 的子类上声明构造函数。
所以,我可以让我的基类将记录器声明为属性并以这种方式注入
public class MyBaseClass
{
public ILogger Logger { get; set; }
}
...但是
- 这并不能保证 Logger 实际上被注入并且不为空。
- 我不喜欢 ILogger 带有公共集
那么...我还有什么其他选择? (我使用的是温莎城堡)。
我已经考虑过做一个界面
public interface IInitializable<T>
{
void Initialize(T instance);
}
public class MyBaseClass : IInitializable<ILogger>, ...could have other IInitializables too...
{
protected ILogger Logger { get; private set; }
public void Initialize(ILogger instance)
{
Logger = instance;
}
}
然后在我的容器上拥有一个工具,可以在类型构造时自动调用 IInitializable<T> 的所有实现...
但在我走这条路之前,我想知道其他人的想法是什么......
【问题讨论】:
-
为什么不想使用静态工厂模式?
-
Ctor 注入等,对于不同的测试实现非常有用,等等,但你真的需要这个来记录吗?你真的需要在实例级别改变日志实现的能力吗?静态工厂模式仍然可以让你改变整体日志实现,这通常是需要的。
-
Logger 返回什么的实现需要是动态的。具体而言,Logger.Instance 应根据上下文(即 WCF 操作、WPF 客户端、SL 客户端等)而有所不同。我想我可以在 .Current 中做一个服务定位器,但据我所知,这是一种反模式......
-
看来您需要根据运行时环境(例如 WPF 客户端、SL 客户端等)而不是类型实例级别来改变日志记录。我认为此时与 DI 结合使用的静态工厂非常适合。
标签: .net dependency-injection inversion-of-control castle-windsor