2011-11-10 104 views
3

对于DI我使用微软的Unity。 对于动态看点编织我正在使用剑杆织机。结合依赖注入和动态方面编织

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

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

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

想法到目前为止我有:

  • 查询映射和“手动解决”的依赖(使用IUnityContainer.Registrations属性)。创建一个组合的“DI + AOP”机制 - 给定要解析的类型 - 找到目标映射类型,然后使用Weaver实例化。
  • 创建我自己的实现了IUnityContainer接口,它实例使用韦弗(而不是激活)

附:

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

+0

有趣的问题!我的第一印象是创建一个'IUnityContainer'的新实现,它将方法调用映射到内部的'UnityContainer',但是重新实现'Resolve'以使用AOP工厂方法。但是,如果人们有其他想法,我很感兴趣。 –

+0

检查Unity如何在内部工作,似乎重新实现“解决”决不是一项简单的任务......也不是重新实现“UnityContainer”用于执行“解决”方法的机制。检查Rapier-LOOM源代码显示,改变它实例化对象的方式也是非平凡的......如果达到任何结果,我将更新。 –

+0

你为什么不使用Unity自己的动态拦截功能? –

回答

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()时,该委托将运行。

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

我没有我的参考资料来创建Unity扩展,所以我现在不打算在这个文本框中输入代码。看看网络上的Unity扩展的例子,一旦你了解事情的一起,它们就非常简单。

2

瞥一眼LOOM codeplex页面似乎没有提供任何使用Unity方法拦截无法完成的功能。开始阅读这里:Aspect-Oriented Programming, Interception and Unity 2.0

+0

谢谢你的回答,我一定会深入挖掘拦截;在处理这个问题时,我很快得出结论:组合AOP + DI解决方案比试图连接两个现有解决方案更加大陆...... +1 –

1

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

+0

是你,是吗? –