.net - IoC - 对象实例的动态组合

标签 .net dependency-injection ioc-container mef

有没有办法使用 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/

相关文章:

c# - 微软图形 SDK : Adding Parameters to CalendarView

c# - 表达式 <Func> 问题

http - HybridHttpOrThreadLocalScoped 和 HttpContextScoped 有什么区别

asp.net-mvc-3 - MVC2 到 MVC3 IOC 问题

c# - MVVMLight 中 IoC 容器的好处

.net - 使用 Kestrel 和 .NET 核心中间件压缩 HTTP 响应

c# - 从泛型类中的接口(interface)继承

php - 复合模式和依赖注入(inject)

java - 具有构造函数的类的依赖注入(inject)需要有关登录 SecurityContext 的用户的信息

dependency-injection - 某些服务无法使用库 : NetCore. AutoRegisterDi 构建