我们正在构建一个使用PolicyInjection来执行某些任务的框架。我们为此使用了属性。这段代码是在一个单独的框架解决方案中编写的。
Out CallHandler可以如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
public class MyCallHandlerAttribute : HandlerAttribute
{
...
}
在Unity中我们有:
namespace Microsoft.Practices.Unity.InterceptionExtension
{
public abstract class HandlerAttribute : Attribute
{
...
}
}
在客户端解决方案中,我们有一个调用处理程序(MyCallHandler),我们使用Unity注册。要执行调用处理程序中的代码,我们需要在模型的类/方法/属性之上添加属性:
[MyCallHandler(params[])]
public class MyModel : IMyModel
{
...
}
现在的问题是,要使用MyCallHandler,我们需要一个对PolicyInjection DLL的引用,以便编译器理解HandlerAttribute是一个Attribute。如果没有引用,我们得到一个'MyCallHandler'不是一个属性类警告(编译时出错)。
我们如何实现这一点,而不需要在我们的客户端解决方案(s)中引用Unity DLL,但只有我们的框架DLL ?
好的。所以在经过一些研究并找到类似但更简单的例子后,我得出结论,除非你在项目中包含大量(如果不是全部)Unity代码,否则这是不可行的。
我所尝试的是创建我自己的策略注入行为,它只查找MyCallHandler
属性,而不查找任何HandlerAttribute
。这意味着我可以让MyCallHandlerAttribute
实现Attribute
而不是HandlerAttribute
。所以MyModel
知道MyCallHandlerAttribute
是一个属性。
这就像一个魅力,但现在的问题是MyModel
不知道ICallHandler
是什么。再次强调,这是一个Unity定义的界面。这很可能会在其他一些事情上继续下去(IUnityContainer
和诸如此类的东西)。
如果有人感兴趣,我可以提供我所做的代码示例。