在客户端使用HandlerAttribute而不引用Unity,而是使用自己的框架



我们正在构建一个使用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和诸如此类的东西)。

如果有人感兴趣,我可以提供我所做的代码示例。

相关内容

  • 没有找到相关文章

最新更新