2009-11-19 4 views
3

이 문제는 기술에 영향을받지 않지만 C# 및 ASP.NET으로 작업 중이며 의사 코드로 사용합니다. 더 나은 접근 방법은 무엇이며, 그 이유는 무엇입니까? 호출자에게 처리디자인 질문 - 비즈니스 계층 방법은 얼마나되어야합니까?

protected void Page_Load(object sender, EventArgs e) { 
SomeBusinessClass.SomeBusinessMethod(); 
} 


public class SomeBusinessClass { 
    public void SomeBusinessMethod() { 
    using (TransactionScope ts = new TransactionScope()) { 
       doStuff(); 
       ts.Complete(); 
      } 
      catch (Exception ex) { 
       LogError("An error occured while saving the order", ex); 
      } 
     } 
    } 
} 
  • 위임 로깅, 트랜잭션 (transaction) 예외 :

    1. 캡슐화 로깅, 트랜잭션 및 예외 처리

      protected void Page_Load(object sender, EventArgs e) { 
          using (TransactionScope ts = new TransactionScope()) { 
            try { 
             SomeBusinessClass.SomeBusinessMethod(); 
             ts.Complete(); 
            } 
            catch (Exception ex) { 
             LogError("An error occured while saving the order", ex); 
            } 
          } 
      } 
      
      
      public class SomeBusinessClass { 
          public void SomeBusinessMethod() { 
           doStuff(); 
          } 
      } 
      

    내가 걱정하는 도입하여 내 비즈니스 로직 코드에서 로깅, 트랜잭션 등에 대한 의존성을 덜어 준다. 기음. 반면에 UI 코드는 훨씬 깨끗해 보입니다. 나는 전화를 할 수 없다. 내가 고려해야 할 다른 요소들을 알려주십시오.

  • +0

    저는 1을 선호합니다. 코드가 트랜잭션에 래핑되어야한다면 내 코드를 호출 할 클라이언트가 트랜잭션에서이를 감쌀 수도 있고 감쌀 수도 있습니다. 또한 UI 부분이 훨씬 깨끗해 보입니다.void를 반환하지 않음으로써 실패한 것이 있으면 사용자에게 알려주는 방법이 있습니다. – iJK

    +1

    왜()와() Dispose()}를 둘 다 사용합니까? – queen3

    +0

    queen3 : 좋은 점, 예제를 수정했습니다. – cdonner

    답변

    5

    거래 : 비즈니스 층의 중앙 우려, (당신이 a unit of work implementation을 통해 트랜잭션 처리를 중앙 집중화 할 수 있지만)이 절대적으로이 문제를 처리해야하므로.

    업데이트 : 더 이상이 부분에 동의하지 않습니다. 종종 컨트롤러, 발표자 또는 다른 최상위 레벨 호출자가 거래를 처리하는 가장 좋은 장소입니다 (대부분 the onion architecture). 대부분의 경우 논리적 작업 단위가 정의됩니다.

    예외 처리 : 모든 레이어에서 필요에 따라 사용하고 비즈니스 레이어 when you can actually do something about it에서만 사용하십시오 (로그에만 적용되는 것은 아닙니다). 인프라에서 지원하는 경우 UI 레이어에서 전역 처리기를 사용하십시오.

    로깅 : 필요한 계층에 추적 또는 정보 로깅을 사용하고 최상위 계층에 예외 만 기록합니다.

    1

    UI를 더 얇게 만드는 모든 것이 당신의 삶을 더 쉽게 만듭니다.

    +0

    그래, 그래. 모든 장소에 살지 않고 한 곳에서 만 지내기 만하면됩니다. 나머지는 학문적이다. –

    2

    컨트롤의 사용 반전은 :

    protected void Page_Load(object sender, EventArgs e) { 
    new SomeBusinessClass(_logger, _dbcontext, _exceptionhandler).SomeBusinessMethod(); 
    } 
    

    더 좋은 일이 될 것

    _mybusiness 클래스가 인구 _logger, _dbcontext 및 _exceptionhandler과 함께 IoC 컨테이너를 통해 페이지에 전달됩니다
    protected void Page_Load(object sender, EventArgs e) { 
        _mybusinessclass.SomeBusinessMethod(); 
    } 
    

    . 당신은 예를 들어, 수동 _exceptionhandler 작성해야하는 경우 "새 RedirectExceptionHandler (이)", 다음

    protected void Page_Load(object sender, EventArgs e) { 
        _mybusinessclass.SomeBusinessMethod(new RedirectExceptionHandler(this)); 
    } 
    

    이제 정말 특정 디자인 결정으로 요약된다. MVC를 사용하기 때문에 ASP.NET에서 IoC를 수행하는 방법을 모르겠다.

    또 다른 옵션은 Aspect Oriented Programming을 사용하여 예외를 포착하고 로깅을 수행하는 것입니다. 또 다른 옵션 (www.sharparchitecture.net에서 사용 가능)은 메소드의 [Transaction] 속성을 사용하여 트랜잭션을 선언적으로 처리하는 것입니다.