我正在编写一个插件作为插件架构的一部分。创建插件的方式是通过反射和 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,如果没有,将从上面选择哪种方法?
注意: 上面的代码尚未编译,只是我认为可行的想法。如果它们是有效的方法,请发布更正。
最佳答案
由于您使用的是 .NET 4,您可能需要考虑使用 MEF,因为它内置于框架本身中。这看起来很简单,MEF 处理得很好,因为它主要用于可扩展性。
有关详细信息,请参阅 Learn More page on the MEF CodePlex site 。
关于c# - 在没有第三方框架的情况下实现 DI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9268103/