对于DI,我正在使用Microsoft的Unity。
对于动态的外观编织,我使用的是Rapier-LOOM。

方面编织者要求我使用工厂方法Weaver.CreateInstance(System.Type)实例化编织对象,并且不提供与现有实例交织的方法。

DI容器允许我使用IUnityContainer.Resolve(System.Type)方法来解析依赖关系,该方法可以解析依赖关系,还可以实例化注入类型的对象。

这两种方法显然是冲突的。
解决此冲突的推荐方法是什么?

到目前为止,我有以下想法:

  • 查询映射并“手动解决”依赖性(使用IUnityContainer.Registrations属性)。创建组合的“DI + AOP”机制-给定要解析的类型-查找目标映射类型,然后使用Weaver实例化。
  • 创建我自己的IUnityContainer接口实现,该接口使用Weaver(而不是Activator)实例化

  • 附言

    如果我在这里偏离轨道,可以避免而不是解决冲突,请告诉我。

    最佳答案

    我对Rapier-LOOM不熟悉,所以我只会从Unity的角度进行讨论。有几种不同的功能/复杂度的方法。幸运的是,它们都不涉及重新实现IUnityContainer。

    您可以做的最简单的事情是使用InjectionFactory通过Weaver创建要注册的寄存器类型。这使您可以指定将执行以创建实例的委托,而不是默认行为。像这样:

      container.RegisterType<ISomething>(
        new InjectionFactory(c => {
            var newObject = (Something)Weaver.CreateInstance(typeof(Something));
            newObject.Property1 = c.Resolve<TypeOfProperty1>();
            newObject.Property2 = c.Resolve<TypeofProperty2>();
            return newObject;
        });
    

    然后,当您调用container.Resolve()时,该委托将运行。

    第二种方法是创建一个Unity扩展,该扩展将Weaver.CreateInstance调用挂接到创建链中。您可以在主策略链中使用自定义策略,也可以尝试覆盖构建计划。前者要容易得多。

    我手头没有创建Unity扩展的参考,因此我现在不会尝试在此文本框中键入代码。在网上查找Unity扩展的示例,一旦您了解了事情的发展,它们就非常简单。

    10-07 15:43