跨多个层的Unity接口拦截

时间:2015-03-06 16:38:02

标签: c# dependency-injection unity-container unity-interception

任何建议都会对此表示赞赏。

我有一个标准的NTier应用程序,它实现了Unity DI。这非常好,创建了统一容器并在BAL中注册了所有内容。我还使用上面方法的属性修饰配置了接口拦截。我试图测量某些方法的时间。接口拦截在BAL层中工作得非常好,但是当我尝试使用相同的方法时,就像BAL引用的一个名为DistributionProviders的层一样,它永远不会遇到调用处理程序。

我用来配置接口拦截的代码是:

   _container.AddNewExtension<Interception>()
                .Configure<Interception>()
                .SetInterceptorFor<ISftpState>(new InterfaceInterceptor());

属性是类:

    public class ProcessLoggingAttribute : HandlerAttribute
    {
        public override ICallHandler CreateHandler(IUnityContainer container)
        {
            return new ProcessLoggingHander(); 
        }
    }

ProcessLoggingHandler是:

public class ProcessLoggingHander : ICallHandler
{

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {

        Console.WriteLine("Starting");
       var methodReturn = getNext().Invoke(input, getNext); 

       Console.WriteLine("finishing");
       return methodReturn;            
    }

    public int Order { get; set; }
}

接口方法装饰示例:

public interface ISftpState
{
     [ProcessLogging]
     bool Connect();
}

任何人都可以向我解释我做错了什么。我唯一能想到的是容器没有传递给HandlerAttribute的CreateHandler()方法。

- 附加代码 - 这就是我注册Unity容器的方式。它实际上是一个单身人士的财产。我只是解析顶级控件类,然后自动解析它下面的其他类。

UnityContainer _container = new UnityContainer();
_container.RegisterType<ISftpState,SftpState>();

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解您的用例。

但是,您是否尝试将您的方法属性放在实现您的接口的类中?您似乎只在界面中声明了该属性。

请参阅此stackoverflow:Can a C# class inherit attributes from its interface?