2013-04-05 3 views
0

엔터프라이즈 라이브러리 로깅 응용 프로그램 블록을 사용하여 메서드 매개 변수 이름, 해당 값 및 반환 형식 값을 기록하는 방법이 있습니까? 아래 코드 샘플을 제공합니다. 요구 사항은 메소드의 입력 매개 변수 값과 반환 형식 값이엔터프라이즈 라이브러리 로깅 응용 프로그램 블록을 사용하여 메서드 매개 변수 및 반환 형식을 로깅

// Complex Types 
public class UserDetails 
{ 
    public string UserName { get; set; } 
    public int UserAge { get; set; } 
    public string UserAddress { get; set; } 
} 
public class User 
{ 
    public string UserId { get; set; } 
    public string Pwd { get; set; } 
} 

//Interface 
public interface IService 
{ 
    UserDetails GetUserDetails(User ReqUser); 
} 

//Imp 
public class Service : IService 
    { 

     [LogCallHandler(Categories = new string[] { "General" }, LogBeforeCall = true, LogAfterCall = true , 
     BeforeMessage = "This occurs before the call to the target object",AfterMessage="This occured after method call",IncludeParameters=true)] 
     public UserDetails GetUserDetails(User ReqUser) 
     { 
      UserDetails oUD = new UserDetails(); 
      oUD.UserName = "hhh" + ReqUser.UserId; 
      oUD.UserAge = 100; 
      oUD.UserAddress = "HHHHHHHHHHHHHHHHHHHHHHH"; 
      return oUD; 
     } 

     #endregion 
    } 

//Usage 
private void button2_Click(object sender, EventArgs e) 
{ 
    IUnityContainer container = new UnityContainer().LoadConfiguration(); 
    container.AddNewExtension<EnterpriseLibraryCoreExtension>(); 
    IService service = container.Resolve<IService>(); 
    User nUser = new User(); 
    nUser.UserId = "TTTTT"; 
    nUser.Pwd = "XXXXX"; 
    UserDetails mm = service.GetUserDetails(nUser); 

} 

사람이 사용하는 엔터프라이즈 라이브러리 로깅 응용 프로그램 블록을 구현하는 방법을 설명 시겠어요의 로그입니다?

답변

0

PostSharp API를 사용하여 메소드 호출을 가로 채기 위해 OnMethodBoundaryAspect을 작성할 수 있습니다.
OnMethodBoundaryAspect.OnEntry 메서드에는 메서드 및 해당 인수에 대해 필요한 모든 정보를 제공하는 MethodExecutionArgs 매개 변수가 포함됩니다.

요구 사항에 매우 근접한 샘플 로깅 측면 구현을 보려면 this 게시물을 참조하십시오.

// This method is executed before the execution of target methods of this aspect. 
public override void OnEntry(MethodExecutionArgs args) 
{ 
    // Build method information to log. 
    string methodInfo = BuildMethodInformation(args.Arguments); 

    // continue with your logging... 
} 

이 같은 MethodExecutionArgs 매개 변수의 Arguments 부재를 통하여 메소드 매개 변수를 얻을 수 있습니다 :

메서드 매개 변수에 대한
private string BuildMethodInformation(Arguments arguments) 
{ 
    var sb = new StringBuilder(); 
    sb.Append(_methodName); 
    foreach (var argument in arguments.ToArray()) 
    { 
     sb.Append(arguments.GetArgument(i) ?? "null"); 
    } 
    return sb.ToString(); 
} 

this 또는 this 샘플을 확인합니다. 이들은 캐싱을 위해 빌드되지만 BuildCacheKey/GetCacheKey 메소드는 메소드의 인수 정보를 얻는 데 필요한 모든 정보를 포함합니다.

+0

정보를 보내 주셔서 감사합니다. 우리의 계획은 PostSharp를 entlib로 대체하는 것입니다. 그래서 당신의 대답은 나를 위해 일하지 않을 것입니다. – vibinkgl

+0

나는 본다. PostSharp 제약 조건을 알지 못하기 때문에 PostSharp 측면에서 EntLib 로그 작성기를 사용할 수 있다고 생각했습니다. 그런 다음 이번에는 필자의 필요성을 정확하게 생각하면 LogCallHandler를 사용하여 다음 답변을 따라갈 수 있습니다 (주석의 문자 제약 때문에). – Hasan

0

당신은 코드에 의해 EntLib LogCallHandler를 사용할 수 있습니다

container.AddNewExtension<EnterpriseLibraryCoreExtension>(); 
container.RegisterType<IService, Service>(
    new InterceptionBehavior<PolicyInjectionBehavior>(), 
    new Interceptor<TransparentProxyInterceptor>()); 

또는 설정 파일에 의해

:

여기
<unity> 
    <sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" /> 
    <namespace name="LoggingCallHandler" /> 
    <assembly name="LoggingCallHandler" /> 
    <container> 
     <extension type="Interception" /> 
     <extension type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity.EnterpriseLibraryCoreExtension, Microsoft.Practices.EnterpriseLibrary.Common" /> 
     <register type="IService" mapTo="Service"> 
      <interceptor type="TransparentProxyInterceptor" /> 
      <policyInjection /> 
     </register> 
    </container> 
</unity> 

, LoggingCallHandler는 서비스 클래스의 네임 스페이스/조립입니다. 다른 방법으로는 다음과 같이 당신의 유형 별칭을 정의 할 수 있습니다

<alias alias="Service" type="LoggingCallHandler.Service, LoggingCallHandler"/> 
<alias alias="IService" type="LoggingCallHandler.IService, LoggingCallHandler"/> 

로깅 블록 구성을 포함한 전체 구성 this 또는 this 설명을 참조하십시오.