2009-04-23 5 views
2

내 도메인 개체에서 log4net을 직접 사용하는 것이 바람직하지 않은지 궁금합니다 ... ASP.NET MVC 응용 프로그램 측면에서 내 예외를 위해 ELMAH를 사용할 것이지만 정보를 얻기 위해 로그에 기록하고 싶습니다 도메인 모델 자체에 대한 일부 데이터.내 도메인 모델 객체에서 log4net을 직접 사용해야합니까?

주어진 다음의 도메인 객체 : 이것은 고전

 public class Buyer 
{ 
    protected static readonly ILog log = LogManager.GetLogger(typeof(SupportTicket)); 

    public Buyer() 
    { 
     log4net.Config.XmlConfigurator.Configure(); 
    } 


    private int _ID; 
    public int ID 
    { 
     get { return _ID; } 
     set 
     { 
      _ID = value; 
     } 
    } 

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>(); 
    public IList<SupportTicket> SupportTickets 
    { 
     get 
     { 
      return _SupportTickets.ToList<SupportTicket>().AsReadOnly(); 
     } 
    } 

    public void AddSupportTicket(SupportTicket ticket) 
    { 
     if (!SupportTickets.Contains(ticket)) 
     { 
      _SupportTickets.Add(ticket); 
     } else { 
      log.Warn("Duplicate Ticket Not Added."); 
     } 
    } 
} 

답변

1

도메인 객체에서 로그하고 스왑 아웃하려는 IOC 컨테이너를 사용하려는 경우 서비스 로케이터 패턴을 사용하는 것이 좋습니다. msoft의 ServiceLocator를보다 유용한 오류 메시지로 래핑하는 SafeServiceLocator의 멋진 구현을 위해 Sharp # 아키텍처를 살펴볼 수 있습니다.

예제에 표시되는 오류 유형을 기록할지 여부를 고려해 보는 것이 좋습니다.이 경우 도메인 객체가 예외를 던져서 호출자가 응용 프로그램에서 예상 한 것이 었는지 (따라서 기록해서는 안되는지) 또는 호출자가 원하는 상황을 나타내는 지 여부를 결정하게하는 경향이 있습니다 어떤 식 으로든 다룰 수 있습니다.

+3

서비스 로케이터는 패턴이 아니기 때문에 종속성 삽입의 목적을 상실합니다. 이 대답은 주관적으로 잘못된 것이 아니며 객관적으로 잘못되었습니다. – jason

+0

Jason과 동의합니다. 추가 정보 : http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – autonomatt

1

:

public class Buyer 
{ 
    private int _ID; 
    public int ID 
    { 
     get { return _ID; } 
     set 
     { 
      _ID = value; 
     } 
    } 

    private IList<SupportTicket> _SupportTickets=new List<SupportTicket>(); 
    public IList<SupportTicket> SupportTickets 
    { 
     get 
     { 
      return _SupportTickets.ToList<SupportTicket>().AsReadOnly(); 
     } 
    } 

    public void AddSupportTicket(SupportTicket ticket) 
    { 
     if (!SupportTickets.Contains(ticket)) 
     { 
      _SupportTickets.Add(ticket); 
     } 
    } 
} 

는 그래서는 다음과 같이 것 essentialy ... AddSupportTicketMethod에 나쁜 생각을 로깅 동작을 추가 문제!

이 작업을 수행하는 좋은 방법은 ILogger 유형의 클래스 멤버를 소개하고이 인터페이스에 로깅을 추상화하는 것입니다. 클래스에서 logg에 대한 호출을 할 때마다이 인터페이스를 통해 수행하십시오. 그런 다음 사용 가능한 IoC 컨테이너 또는 종속성 주입 팜 워크 중 하나를 사용하여 구현 중 하나를 사용하여 런타임에이 종속성을 주입합니다. 기본적으로이 인터페이스의 log4net 구현을 사용할 수 있습니다.

는 여기 의존성 주입 프레임 워크의 긴 목록입니다 http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx

0

내가 십자가 절단 우려 로깅이 생각하는, 그래서 가장 잘 측면 지향 방식으로 이루어집니다. Spring.NET과 같은 프레임 워크를 사용하고 있다면 사용할 수 있습니다.

3

저는 log4net 및 log4J를 도메인 객체에서 직접 사용했습니다. 이것은 좋은 부작용과 나쁜 것들을 가지고 있습니다.

  • + : 도메인 개체의 로깅이 간단하고 코드를 간단하고 당신이 log4net 기능을 활용할 수 있습니다 알고 있습니다.
  • - : 그것은 나
  • 문제가되지 않을 수도 있습니다 도메인 오브젝트의 사용 log4net 구성에 관심을 지불 할 필요를 만드는 프로그램, 의미 -을 : 당신은 당신의 도메인 객체를 링크 할 수 없습니다 호출 프로그램과 다른 log4net 버전이 사용 중입니다. log4net 1.2.0.10에 링크 된 항목 하나와 이전 릴리스에 링크 된 항목이 많은 충돌을 보았습니다.

도메인 개체에을 로깅하지 않는 것은 좋지 않습니다. 대안은 다른 로깅 프레임 워크를 연결하거나 해당 인터페이스에 대한 로깅 및 로깅을 수행하는 인터페이스를 만들 수있는 다른 프레임 워크, 제안 또는 종속 프레임 워크 또는 외부 프레임 워크 (예 : log4J에 대한 commons-logging)입니다. (도메인 객체를 사용하는 코드는 로깅 목적으로 해당 인터페이스의 적절한 인스턴스를 제공해야합니다.)