对于DI,我使用的是Microsoft的Unity。 对于动态Aspect Weaving,我使用的是Rapier-LOOM。
方面编织器要求我使用工厂方法Weaver.CreateInstance(System.Type)
实例化编织对象,并且不提供交织现有实例的方法。
DI容器允许我使用IUnityContainer.Resolve(System.Type)
方法解析依赖关系,该方法解析依赖关系并实例化注入类型的对象。
这两种方法显然存在冲突。 解决此冲突的推荐方法是什么?
到目前为止我的想法:
IUnityContainer.Registrations
属性)。创建一个组合的“DI + AOP”机制 - 给定要解析的类型 - 找到目标映射类型然后使用Weaver实例化。IUnityContainer
接口实现,使用Weaver(而不是Activator)实例化P.S。
如果我在这里偏离轨道并且可以避免冲突而不是解决 - 请告诉我。
答案 0 :(得分:2)
对LOOM codeplex页面的一瞥似乎没有提供使用Unity方法拦截无法完成的任何功能。从这里开始阅读:Aspect-Oriented Programming, Interception and Unity 2.0
答案 1 :(得分:2)
我对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扩展的示例,一旦了解了事情的合理性,它们就非常简单。
答案 2 :(得分:1)
这是一个不好的论点。如果我说微软的Unity没有提供任何无法用.NET框架完成的功能,那就是一样的。问题是,我的问题的最佳编程模型是什么。答案可能是需要实现需求的代码量。 AOP,尤其是Rapier-LOOM.NET不是一个简单的方法初始设施。 AOP的目标是封装横切关注点。为此,您需要建议,介绍,连接点变量,基于代码的注释等。如果我想实现的不仅仅是一个简单的跟踪示例,您需要比方法开始更强大的概念。