有没有办法使用 IoC、MEF [Imports] 或其他 DI 解决方案在对象创建时而不是在组合时动态组合依赖项?
这是我目前的想法。如果您有一个引发事件的对象实例,但您不是一次创建该对象并将其保存在内存中,则必须在每次创建该对象时注册事件处理程序。据我所知,大多数 IoC 容器要求您注册组合中使用的所有类,并调用 Compose() 以使其连接所有依赖项。
我认为由于对象创建、依赖注入(inject)等的开销,这可能是一个可怕的设计(我正在处理一个遗留系统)来做到这一点......但我想知道是否可以使用其中之一新兴的 IoC 技术。
也许我混淆了一些术语,但我的目标是避免编写一个框架来“连接对象实例上的所有事件”,并使用 MEF 之类的东西来[导出]处理程序(依赖项)到一个非常特定的接口(interface)并将它们 [ImportMany] 导入到一个对象实例中,因此如果应用程序启动时程序集在那里,我的导出就会被调用。因此,也许应用程序启动时所有对象仍然可以组合,但我希望系统在创建和销毁对象时找到并调用所有对象。
最佳答案
通常,在 DI/IoC 环境中处理动态实例化的方式是使用抽象工厂。工厂是唯一允许与容器直接交互的类类型,以便在实例化新对象时解决依赖关系。
public interface IWidgetFactory
{
IWidget CreateWidget(...);
}
public class MyIocWidgetFactory : IWidgetFactory
{
private IoCContainer container;
public MyIocWidgetFactory(IoCContainer container)
{
if (container == null)
throw new ArgumentNullException("container");
this.container = container;
}
public IWidget CreateWidget(...)
{
// Assumes that the container is configured to create transient objects
// for IWidget, not a singleton.
return container.Resolve<IWidget>();
}
}
请不要将此与服务定位器反模式混淆;不允许任何其他东西接触容器,只有工厂,并且它只创建一种类型的对象。
此时,您只需将 IWidgetFactory
传递给在运行时创建小部件的任何需要。就是这样 - 您已经维护了 DI。
关于.net - IoC - 对象实例的动态组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3016190/