2009-09-12 8 views
0

층에서 내 C# 응용 프로그램을 분할하는 동안, 나는 다음과 같은 방법으로 레이어 사이에서 순환 종속성의 문제를 해결 한 :C# 순환 종속성 문제 해결은 기술

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.Common; 
using SolvingCircularDependency.DA; 

namespace SolvingCircularDependency.BO 
{ 
    public class MyClass : IPersistent 
    { 
     private string _message; 
     public string Message 
     { 
      get { return _message; } 
      set { _message = value; } 
     } 

     public bool Save() 
     { 
      return MyClassDA.Save(this); 
     } 
    } 
} 


using System; 
using System.Collections.Generic; 
using System.Text; 

namespace SolvingCircularDependency.Common 
{ 
    public interface IPersistent 
    {   
     bool Save(); 
     string Message { get;} 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.Common; 

namespace SolvingCircularDependency.DA 
{ 
    public class MyClassDA 
    { 
     public static bool Save(IPersistent obj) 
     { 
      Console.WriteLine(obj.Message); 

      return true; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Text; 

using SolvingCircularDependency.BO; 

namespace SolvingCircularDependency.UI 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass myobj = new MyClass(); 
      myobj.Message = "Goodbye Circular Dependency!"; 
      myobj.Save(); 

      Console.ReadLine(); 
     } 
    } 
} 

사람은 나에게 "일반적인"와 같은 더 나은 솔루션을 제안 할 수 있습니다 sln의 프로젝트가 나에게 과장되어 보입니까?

답변

2

공용 또는 서비스 어셈블리에서 IPersistent를 선언해야하는지 여부는 사용자가 결정해야합니다. 가장 좋은 방법은 (보통) 더 나은 레이어 분리를 위해 별도의 어셈블리에 인터페이스를 선언하는 것입니다. 개발자가 IPersistent의 구현을 얼마나 자주 만들 것인지 같은 것들을 고려할 필요가 있습니다. 실제로 느슨한 결합 등이 필요합니다.

+0

서비스 어셈블리의 의미는 무엇입니까? – anonymous

+0

죄송합니다, 솔루션에 DA가 있습니다. – UserControl

+1

죄송합니다. 이전 질문에 대한 대답이 명확하지 않을 수 있습니다. 나는 Common이 다른 어셈블리에 의존성이없는 어셈블리라고 생각한다. 이것이 사실이라면 어셈블리가 IP 공유 인터페이스를 호스팅하기에 좋은 후보라는 의미입니다. – UserControl

1

종속성 반전 원리에주의하십시오.

+0

예, DI는 서비스/인터페이스 문제를 다루는 일반적인 경우입니다. – UserControl

+0

DI를 사용하여이 프로그램을 다시 작성할 수 있습니까? – anonymous

+1

아니요,하지 마십시오. 내 말은, 당신이 이런 식으로 질문하면. DI는 실생활에서 거의 요구되지 않는 '느슨한 커플 링'을 의미합니다 (부적절하게 사용하면 놀라운 구성 편이성이 추가됩니다). – UserControl

0

IPersistence는 DA에 대한 관심사이며 BO가이를 통해 통신 할 수있는 수단입니다. 그 관계는 끝나야합니다. 귀하의 UI는 당신의 BO 만 알고 있어야하고 "계약서 작성"을 지원하기 위해 새로운 인터페이스를 정의해야하는 경우 BO에 새 인터페이스를 정의하십시오. 귀하의 UI와 BO는 시스템 내에서하는 일에 대해 별도의 관심을 가져야합니다.

예를 들어 IPersistence 인터페이스는 레코드를 데이터베이스에 유지하기위한 특정 타스크를 정의합니다. BO를 우회 할 것이기 때문에 UI에서이를 원하지 않습니다. 따라서 실제로 아무것도하지 않고 전혀 존재하지 않는 빈혈 BO를 원한다면 비즈니스 논리를 지원하는 것과 관련하여 그 수준에서 새로운 것을 정의하십시오.