【发布时间】:2012-02-15 16:50:22
【问题描述】:
我正在编写一个插件作为插件架构的一部分。创建插件的方式是通过反射和CreateInstance。因此调用了默认构造函数。这段代码我无法触及,我试图找到一种明智的方式来使用 DI,而无需使用框架。
我相信我有 3 个选择:
i) 穷人的 DI (PMDI)
ii) 工厂模式
iii) TinyIOC 或类似的(一个处理 DI 的 cs 文件)
我开始查看 PMDI,但后来一个依赖项需要另一个依赖项,所以我最终得到了与此类似的东西,这很丑陋并且可能会变得更糟:
public MyMainPluginClass() : this(new Repo(new Logger()))
{
}
public MyMainPluginClass(IRepo repo)
{
}
然后我转向了工厂模式的想法,但找不到任何像样的演示代码。我想我会有这样的东西:
public static FactoryUtility
{
public static IRepo GetRepo()
{
return new Repo(GetLogger());
}
public static ILogger GetLogger()
{
return new Logger();
}
}
public MyMainPluginClass() : this(FactoryUtility.GetRepo())
{
}
public MyMainPluginClass(IRepo repo)
{
}
是这样的吗?
然后我遇到了TinyIOC,这是一个完成所有依赖项注册的类,但我相信它需要在类库中没有的 Program.cs 中进行设置。如果有人有任何使用经验,可以这样使用:
public MyMainPluginClass()
{
var container = TinyIoCContainer.Current;
container.AutoRegister();
var implementation = container.Resolve<IRepo>();
MyMainPluginClass(implementation);
}
public MyMainPluginClass(IRepo repo)
{
}
是否有任何替代方法可以在不使用 3rd 方库的情况下实现 DI,如果没有,可以从上面选择哪种方法?
注意: 上面的代码尚未编译,只是我认为可行的想法。如果它们是有效的方法,请发布更正。
【问题讨论】:
-
仅供参考;您的第三个代码示例也基本上是糟糕的依赖注入。
标签: c# .net .net-4.0 dependency-injection inversion-of-control