我希望做一些简单的事情,例如从配置文件中动态地实例化一个类,其中配置文件存储类型名称列表。我想知道我是否应该使用Unity Framework或只是使用Activator.CreateInstance。主要区别是什么?
我想做的样本:
LIST myList = Config.GetSection... blah blah
foreach(item in in mylist) {
IPlugIn x = (IPlugIn)Activator.CreateInstance(item.myPlugInTypeFromConfig,myassembly);
x.Start();
}
就我而言,似乎我不需要Unity Framework,只能使用激活器。
答案 0 :(得分:3)
根本区别在于Unity(或任何DI容器)实际上可以管理您的依赖项。 Activator.CreateInstance只是创建实例。
如果您的某些类型具有构造函数参数而某些类型没有,那该怎么办?或者您想要设置的属性?容器将递归对象图并确定应将哪些值放入这些构造函数参数或属性中。 Activator.CreateInstance不会这样做。
容器管理对象的生命周期。如果对于某些类型,您总是希望A类型具有相同的实例,但是B的每个类型都需要一个新实例?使用容器执行此操作非常简单,您必须自己为Activator.CreateInstance执行此操作。
如果你所做的只是“从没有参数的配置文件中新建这个类型列表”,那么你是对的,你不需要一个容器。一旦你超越了它,一个容器就会给桌子带来更多的力量。
答案 1 :(得分:1)
如果你有许多将要使用组件的类,你会想要使用Unity。在这些情况下,依赖注入在构造函数时发生。
然而,它不是,恕我直言,插件架构的存储库。在我看来,你正在做你需要做的事情(虽然你需要一个演员表和程序集名称),但有一个例外。插件架构通常使用ConfigurationManager来控制插件的加载。
关于此类建筑的真实好文章,您可以阅读Dobbs博士的this article。