对于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扩展的示例,一旦您了解了事情的发展,它们就非常简单。