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

时间:2011-11-10 10:52:51

标签: .net dependency-injection unity-container aop rapier-loom

对于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。

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

3 个答案:

答案 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的目标是封装横切关注点。为此,您需要建议,介绍,连接点变量,基于代码的注释等。如果我想实现的不仅仅是一个简单的跟踪示例,您需要比方法开始更强大的概念。