Asp.net mvc 使用自动布线的统一截取

Asp.net mvc 使用自动布线的统一截取,asp.net-mvc,unity-container,aop,interceptor,Asp.net Mvc,Unity Container,Aop,Interceptor,我使用HadleAttribute和ICallHandler实例实现了Unity拦截。为了让它工作,我所要做的就是用[Trace]属性装饰类,拦截器工作得很好 [跟踪] 公共接口IPersonService { 字符串GetPerson(); } 但是,我希望在几个程序集中拦截我的所有方法。因此,我使用Unity AutoRegistration设置容器,如下所示: 私有静态IUnityContainer BuildUnityContainer() { var container=new Un

我使用HadleAttribute和ICallHandler实例实现了Unity拦截。为了让它工作,我所要做的就是用[Trace]属性装饰类,拦截器工作得很好

[跟踪]
公共接口IPersonService
{
字符串GetPerson();
}
但是,我希望在几个程序集中拦截我的所有方法。因此,我使用Unity AutoRegistration设置容器,如下所示:

私有静态IUnityContainer BuildUnityContainer()
{
var container=new UnityContainer();
//container.AddNewExtension();
容器。
配置自动注册()。
ExcludeSystemAssemblys()。
LoadAssemblyFrom(类型(PersonService).Assembly.Location)。
包括(如果为.implementsTypeName,则为.Register()。
ApplyAutoRegistration();
返回容器;
}
非常有效,除非我试图按照本文设置全局注册:

我的UnityContainerExtension配置如下,其中MVC4Unity是我的DLL:

公共类UnityInterfaceInterceptionRegister:UnityContainerExtension
{
受保护的覆盖无效初始化()
{
base.Container.AddNewExtension();
base.Container.Configure()。
AddPolicy(“日志策略”)。
添加匹配规则
(新的注入构造函数(“MVC4Unity”)。
AddCallHandler(新的TraceCallHandler());
base.Context.registing+=新的EventHandler(this.OnRegister);
}
私有void OnRegister(对象发送方、RegisterEventArgs e)
{
IUnityContainer container=发送方作为IUnityContainer;
if(e!=null&&e.TypeFrom!=null&&e.TypeFrom.IsInterface)
{
container.Configure()
.SetInterceptorFor(e.TypeFrom,e.Name,new InterfaceInterceptor());
}
}
}
不幸的是,当它进入OnRegister方法时,总是抛出StackOverflowException(!)

接下来的问题是,是否有人使用Unity实现了程序集甚至命名空间范围的截取,这是正确的做法

[编辑]

似乎无论我在下面的AddMatchingRule行中添加了什么,OnRegister处理程序也会为所有包含的程序集调用!(例如,即使是Microsoft.*命名空间程序集!)

base.Container.AddNewExtension();
base.Container.Configure()。
AddPolicy(“日志策略”)。
//看看还有什么其他类型的匹配规则!
添加匹配规则
(新的注入构造函数(“MVC4Unity.*))。
AddCallHandler(新的TraceCallHandler());
base.Context.registing+=新的EventHandler(this.OnRegister);

我的答案晚了,但也许有人会发现这很有用

  • 如果我正确理解了这个问题,您需要将一个匹配规则应用于多个程序集。对于此类任务,您可以使用
    AssemblyMatchingRule
    ()

    container.Configure()
    .AddPolicy(“日志记录”)
    
    .AddMatchingRule

    我的答案迟到了,但也许有人会发现这很有用

    • 如果我正确理解了这个问题,您需要将一个匹配规则应用于多个程序集。对于此类任务,您可以使用
      AssemblyMatchingRule
      ()

      container.Configure()
      .AddPolicy(“日志记录”)
      .AddMatchingRule

      container.Configure<Interception>()
        .AddPolicy("logging")
        .AddMatchingRule<AssemblyMatchingRule>(
           new InjectionConstructor(
           new InjectionParameter("YourAssemblyName")))
        .AddCallHandler<LoggingCallHandler>(
           new ContainerControlledLifetimeManager(),
           new InjectionConstructor(), new InjectionProperty("Order", 1));