2014-02-21 41 views
1

即时通讯尝试创建一个带有Microsoft Unity和AOP的记录器,但有些东西不起作用......我不明白..我只知道我不记录任何东西。用Unity和AOP创建一个日志

这里记录器的代码:

public class LoggerHandler : ICallHandler 
{ 
    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     //The code to write a file 

     return result; 
    } 

    ... 
} 

在这里,我创建属性:

//create an attribute so you can apply it to your methods 
public class LoggerAttribute : Attribute 
{ 
    public LoggerAttribute() 
    { 
     //Here I have a breakpoint just to understand if i go here. I never stop here 
    } 
} 

这里的帮手通过的web.config配置拦截

public class GetTypeConverter : TypeConverter 
{ 
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
    { 
     return Type.GetType(value.ToString()); 
    } 
} 

而且这里web.config

<types>      
    <type type="en.MFS.BLL.Countries.ICountries, en.MFS.BLL.Countries" 
         mapTo="en.MFS.BLL.France.FranceBLL, en.MFS.BLL.France"> 

     <interceptor type="TransparentProxyInterceptor" /> 
    </type> 
</types> 

<extension type="Interception" /> 
<interception> 
    <policy name="LoggerPolicy"> 
     <matchingRule name="TransactionMatchingRule" type="CustomAttributeMatchingRule"> 
      <constructor> 
        <param name="attributeType" type="System.Type"> 
        <value value="en.MFS.LoggerInterception.LoggerAttribute"        typeConverter="en.MFS.LoggerInterception.GetTypeConverter, en.MFS.LoggerInterception"/> 
        </param> 
        <param name="inherited" value="true" /> 
      </constructor> 
     </matchingRule> 
     <callHandler name="LoggerHandler" 
          type="en.MFS.LoggerInterception.LoggerHandler, en.MFS.LoggerInterception" > 
       <property name="Order" value="1" /> 
     </callHandler> 
    </policy> 
</interception> 

而在最后,我如何使用它

[Logger] 
GetCalculation_OutDTO GetCalculation(GetCalculation_InDTO calculationDTO); 

那么,什么是错的?为什么我不设法进入LoggerAttribute的构造函数?

回答

1

每当我使用Unity完成此操作时,我从特殊的HandlerAttribute类继承了属性,而不是更通用的Attribute类。这样做将使您覆盖CreateHandler方法,并返回您的处理程序的实例:

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

一旦你的,你应该能够连线它在统一引导程序是这样的:

IUnityContainer container = new UnityContainer(); 

container.AddNewExtension<Interception>(); 

container.Configure<Interception>().SetInterceptorFor<IInterfaceName>(new InterfaceInterceptor()); 

return container; 

我不知道web.config发生了什么,但我没有任何东西在我的这里概述的过程工作正常。