2014-11-27 1 views
1

지금은 가져 오기 모듈을 구현 중입니다. 그러나 모든 작업을 기록해야한다는 것도 요구 사항입니다. 예를 들어. 고객을 가져올 때 해당 고객이 이미 있는지 확인해야하며 고객이없는 경우 고객을 만들어야합니다. 두 상황을 모두 기록해야합니다. 나는 모든 'LogMessage (...)'호출은 매우 깔끔하지 생각하기 때문에,로그를 사용하여 코드를 혼란스럽게하지 않고 로깅을 적용하는 방법은 무엇입니까?

public event Action<string> OnMessageLog; 

public void ImportOrder() 
{ 
    LogMessage("The order is being created"); 
    var customer = ImportCustomer("MG_001"); 
    var order = new Order{ Customer = customer }; 
    LogMessage("The order is created"); 

    unitOfWork.Orders.AddObject(order); 
} 

public Customer ImportCustomer(string customerCode) 
{ 
    var customer = this.unitOfWork.Customers.GetByCode(customerCode); 

    if(customer == null) 
    { 
     LogMessage("The customer doesn't exists. A new customer is created"); 
     customer = new Customer{ \\.. here some initialization }; 
    } 
    else 
    { 
     LogMessage("The customer exists."); 
    } 

    return customer; 
} 

private void LogMessage(string message) 
{ 
    if(OnMessageLog != null) 
    { 
     OnMessageLog(message); 
    } 
} 

이 같은 정말 안 :

그래서 그 순간에 나는이 같은 일부 코드가 있습니다.

대신 Decorator Pattern을 사용하려고 생각했지만 가져 오기가 꽤 복잡하기 때문에 구현하기가 어려워졌습니다. 그것은 각 액션에 대해 2 가지 메소드를 생성해야한다는 것을 의미합니다. (많은 액션이 있습니다.)

이 코드를 더 읽기 쉽고/더 깔끔하게 만들 수있는 몇 가지 제안이나 아이디어가 있습니까?

+0

확인하면 수도 작품 시나리오에 대한 다음 (이 종류의 전형적인 예입니다) AOP, 쉽게 될,하지만 아이디어는 동일 할 수 로슬린와 AOP, AOP, AOP ... –

답변

5

PostSharp과 같은 도구를 사용하여 aspect 지향 프로그래밍을 시도 할 수 있습니다.

+0

. 요격을 지원하는 IOC는 어느 정도까지 원하는 결과를 얻을 수 있습니다. –

+0

제안 해 주셔서 감사합니다.하지만 메소드 내부의 조건을 처리하는 방법은 무엇입니까? 예를 들어 내 'ImportCustomer'메소드. 두 가지 상황을 기록합니다. – Martijn

+0

http://doc.postsharp.net/method-decorator와 "OnEntry"방법에 대한 섹션을보십시오. 이 함수를 사용하면 함수에 전달 된 인수를 캡처 할 수 있습니다. 원하는 코드를 정확하게 기록하기 위해서는 코드의 일부를 다시 구성해야 할 수도 있습니다. 새로운 고객과 기존 고객을 서로 다른 두 가지 방법으로 처리하는 경우. –

1

나는 데코레이터가 갈 길이라고 생각합니다. 로깅이 필요하지 않은 경우에도 GetCustomerByCode 및 CreateCustomer 메서드를 추출하는 것이 좋습니다. 이러한 방법 중 일부는 모듈 전체에서 재사용 될 수 있으며 그렇지 않을 수도 있습니다. 코드가 더 읽기 쉽고 테스트 가능하며 유지 관리가 가능합니다.

public Customer ImportCustomer(string customerCode) 
{ 
    var customer = GetCustomerByCode(string customerCode); 

    if (customer == null) 
    { 
     customer = CreateCustomer(); 
    } 

    return customer; 
} 

public Customer GetCustomerByCode(string customerCode) 
{ 
    var customer = this.unitOfWork.Customers.GetByCode(customerCode); 

    return customer; 
} 

public Customer CreateCustomer() 
{ 
    var customer = new Customer{ \\.. here some initialization }; 

    return customer; 
} 
관련 문제