Asp.net mvc 使用自动布线的统一截取
我使用HadleAttribute和ICallHandler实例实现了Unity拦截。为了让它工作,我所要做的就是用[Trace]属性装饰类,拦截器工作得很好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
[跟踪]
公共接口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));
- 如果我正确理解了这个问题,您需要将一个匹配规则应用于多个程序集。对于此类任务,您可以使用