.net 结合依赖注入和动态方面编织

.net 结合依赖注入和动态方面编织,.net,dependency-injection,unity-container,aop,rapier-loom,.net,Dependency Injection,Unity Container,Aop,Rapier Loom,对于DI,我使用的是微软的Unity。 对于动态方面的织造,我使用剑杆织机 aspect weaver要求我使用工厂方法weaver.CreateInstance(System.Type)实例化编织对象,并且不提供交织现有实例的方法 DI容器允许我通过使用IUnityContainer.resolve(System.Type)方法解析依赖关系,该方法解析依赖关系并实例化注入类型的对象 这两种方法显然是冲突的。 解决此冲突的建议方法是什么? 到目前为止,我的想法是: 查询映射并“手动解决”依赖关

对于DI,我使用的是微软的Unity。 对于动态方面的织造,我使用剑杆织机

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

DI容器允许我通过使用
IUnityContainer.resolve(System.Type)
方法解析依赖关系,该方法解析依赖关系并实例化注入类型的对象

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

到目前为止,我的想法是:

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


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

浏览一下LOOM codeplex页面似乎没有提供任何无法使用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.RegisterType(
新注射工厂(c=>{
var newObject=(Something)Weaver.CreateInstance(typeof(Something));
newObject.Property1=c.Resolve();
newObject.Property2=c.Resolve();
返回newObject;
});
然后,当调用container.Resolve()时,该委托将运行

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


我手头没有创建Unity扩展的参考资料,所以我现在不打算尝试在这个文本框中键入代码。看看web上的Unity扩展示例,一旦你了解了它们是如何结合在一起的,它们就非常简单了。

这是一个糟糕的论点。如果我说微软的Unity没有提供删除.NET framework无法完成的任何功能。问题是,对于我的问题,什么是最好的编程模型。答案可能是实现需求所需的代码量。
AOP,尤其是Rapier-LOOM.NET不是一个简单的方法初始设施。AOP的目标是封装横切关注点。为此,您需要建议、介绍、连接点变量、基于代码的注释等。如果我想实现的不仅仅是一个简单的跟踪示例,您需要比方法初始更强大的概念。

ng问题!我的第一印象是创建了一个新的
IUnityContainer
实现,它将方法调用映射到内部
UnityContainer
,但重新实现了
Resolve
以使用AOP工厂方法。然而,如果人们有其他想法,我非常感兴趣。检查Unity在内部是如何工作的,似乎重新实现“Resolve”绝非一项简单的任务……也不是重新实现“UnityContainer”用于执行“Resolve”方法的机制。检查Rapier-LOOM源代码表明,更改其实例化对象的方式也不是简单的任务……如果得到任何结果,我将进行更新。为什么不使用Unity的拥有自己的动态拦截功能?不知道动态拦截意味着什么,我将对此进行检查。Thanx非常感谢!谢谢你的回答,我一定会深入研究拦截;处理这个问题,我很快得出结论,一个组合的AOP+DI解决方案比尝试连接两个现有的解决方案要复杂得多…+1