3

对于 DI,我使用的是 Microsoft 的 Unity。对于动态 Aspect Weaving,我使用的是 Rapier-LOOM。

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

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

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

到目前为止我的想法:

  • 查询映射并“手动解析”依赖项(使用IUnityContainer.Registrations属性)。创建一个组合的“DI+AOP”机制——给定一个要解析的类型——找到目标映射类型,然后使用 Wea​​ver 实例化。
  • 创建我自己的IUnityContainer接口实现,它使用 Wea​​ver(而不是 Activator)进行实例化

附言

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

4

3 回答 3

2

浏览 LOOM codeplex 页面似乎没有提供任何使用 Unity 方法拦截无法完成的功能。从这里开始阅读:面向切面的编程、拦截和 Unity 2.0

于 2011-11-10T15:53:26.007 回答
2

我对 Rapier-LOOM 不熟悉,所以我将仅从 Unity 方面谈谈。有几种不同能力/复杂性的方法。幸运的是,它们都不涉及重新实现 IUnityContainer。

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

  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 扩展的示例,一旦您了解了它们是如何组合在一起的,它们就会非常简单。

于 2011-11-12T01:10:52.787 回答
1

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

于 2012-03-11T09:29:03.733 回答