2013-01-24 2 views
1

asp.net MVC 솔루션에서 작업 중입니다.웹 응용 프로그램의 순환 참조 고정

하나의 하위 프로젝트는 비즈니스 논리/프로세스가 포함 된 BusinessObjects입니다.

또 하나는 마케팅 캠페인/고객 이메일을 보내는 데 사용되는 EmailGeneration입니다.

EmailGeneration 프로젝트는 Business Objects를 기반으로 템플리트 전자 메일을 생성해야하기 때문에 BusinessObjects 프로젝트를 참조합니다.

주문이 완료되면 자동으로 송장을 보낼 수 있도록 비즈니스 개체에서 전자 메일을 트리거 할 수 있어야합니다.

그러나 원형 의존성을 생성하므로 참조를 추가 할 수 없습니다. 이것은 내 디자인에 결함이 있음을 나타냅니다.

어떤 점에서 디자인을 개선 할 수 있습니까?

나는 MEF를 들여다 보았지만 릴리스 이후에 제 3 자 플러그인으로 확장 할 수있는 소프트웨어 작성에 더 적합하다고 생각합니다. 나는 단지 내부 구조를 개선하는 방법을 연구하고 싶다.

+0

나는 인터페이스가 갈 길이라고 생각합니다. [this] (http://stackoverflow.com/q/1318123/551322) 또는 [this] (http://stackoverflow.com/q/6928387/551322)를보십시오. – nrodic

+0

인터페이스를 추출 할 때 값 유형 특성을 처리하는 방법은 무엇입니까? 인터페이스를 구현하도록하십시오. 하지만 그들 중 일부는 커스텀 enum 타입입니다 - 모든 열거 형 정의를 BO 밖으로 이동합니까? – Kev

답변

0

BusinessObjects에서 EmailGenerator에 데이터를 제공하는 데 필요한 속성 만 포함하는 dto 클래스를 설명 할 수 있습니다.

이제 데이터를 '위쪽으로'보내야하는 클래스는 이메일을 트리거해야 할 때 호출해야하는 매개 변수 인 Action<T>을 가져 오는 public static 메서드를 제공해야합니다. 작업에 대한 참조를 저장하십시오.

마지막으로 EmailGeneration이 일부 정적 정적 콜백 메소드를 사용하여 해당 메소드를 호출하여 가입하게하십시오.

EmailGeneration은 BusinessObjects에 정의 된 데이터를 사용하여 알림을받을 수 있으며 모두 작동합니다. 작업이 null 인 경우 BusinessObject는 아무 작업도 수행하지 않으므로 아무 것도 의존하지 않습니다.

(I하지 않았다 때문에이 사건을 언급하지 않았다) 나는 주문이 완료되면, 말, 자동으로 청구서를 보내 내가 할 수 있도록 비즈니스 오브젝트에서 이메일을 트리거 할 수 있어야

+0

전자 메일을 보낼 수있는 많은 비즈니스 개체가 있습니다. SendEmail 방법은 일반적입니다. EmailGeneration을 모든 객체에 가입 시키려면 어떻게해야합니까? 간략한 코드 샘플을 제공 할 수 있습니까? – Kev

+0

비즈니스 계층에 정적/싱글 톤 알리미를 만들 수 있으며 전자 메일 생성을 싱글 톤으로 사용할 수도 있습니다. 그러면 일이 쉬워 질 것입니다. –

0

.

이것은 (제 생각에는) "비즈니스 오브젝트"기능이 아닙니다. BO와 이것을 처리하는 이메일 유틸리티에 의존하는 또 다른 "클래스"가 있어야합니다. 전자 메일이 비즈니스 개체에서 변경된 내용에 의해 "트리거"되어야하는 경우 클래스가 구독 할 BO에 이벤트를 추가합니다.

+0

간단한 예를 제공해 주시겠습니까? – Kev

0

주기적 종속성에 대한 좋은 점은 항상 추출 인터페이스의 리팩토링을 중단 할 수 있다는 것입니다.

1

OOD principles을 따르지 않아서 IMHO 설계에 결함이있는 경우. 그들은 다음과 같습니다 :

  • REP - 릴리스 재사용 동등성 원칙 : 재사용의 과립은 릴리스 과립입니다.

  • CCP - 공통 폐쇄 원칙 : 함께 변경되는 클래스는 함께 패키지됩니다.

  • CRP - 공통 재사용 원칙 : 함께 사용되는 클래스는 함께 패키지됩니다.

    • 어셈블리 재사용의 단위 그리고 당신이 당신의 EmailGeneration를 다시 사용할 수 없습니다 의미 :

    당신에게 뭔가를 말하고있다.

  • BusinessObjects 클래스가 변경되면 EmailGeneration도 변경됩니다.

  • BusinessObjects에서 EmailGeneration에 대한 참조를 필요로하고, EmailGeneration 후 그들은 동일한 어셈블리에 있어야은 BusinessObjects에 대한 참조를 필요로하는 경우 (하지만 물론 다른 네임 스페이스) 어떤 미친 알 수없는 이유로

, 우리 중 많은 사람들이 물리적으로 논리적으로가 아니라 우리의 프로젝트를 분할하는 데 사용되었지만 잘못된 것입니다! 이러한 어셈블리를 다른 어셈블리에 포함시킬 이유가 없으며 이것이 문제의 원인입니다. EmailGeneration 어셈블리 얼마나 많은 수업을 않습니다

그리고 그 후 The Principles of OOD는 이것에 대해 생각 : 봐 주시기 바랍니다

는 이러한 원칙을 먹었어요? 약간이라도 있으면 FxCop이 내가하는 것과 똑같이 말할 것입니다. EmailGeneration은 자체 어셈블리가 없어야합니다.