2009-09-22 9 views
1

디자인 패턴에 익숙하지 않고 이제는 전략 patern을 구현하고 싶습니다. 내 코드는 다음과 같습니다.C# 전략 패턴 및 데이터베이스 액세스

namespace StrategyPattern 
{ 
    public interface ISendBehavior 
    { 
     void Send(); 
    } 

    public class SendAppointment : ISendBehavior 
    { 
     public void Send() 
     { 
      // send item 
     } 
    } 

    public class SendTask : ISendBehavior 
    { 
     public void Send() 
     { 
      // send item 
     } 
    } 

    public class SendItem 
    { 
     ISendBehavior _sendBehavior; 

     public SendItem(ISendBehavior sendbehavior) 
     { 
      _sendBehavior = sendbehavior; 
     } 

     public void Send() 
     { 
      _sendBehavior.Send(); 
     } 
    } 

    /* CALL */ 

    public class Aanroep 
    { 
     public void Verzenden() 
     { 
      SendItem app = new SendItem(new SendAppointment()); 
      app.Send(); 
     } 

    } 
} 

메서드에서 SendAppointment 클래스로 보내기 항목이 전송됩니다. 내 질문은이 클래스의 데이터베이스에 연결해야합니까? 그렇다면 SendTask의 데이터베이스에 연결해야합니다. 그러나이 시점에서 나는 스스로 반복하고 있습니까? 따라서 연결 문자열이 변경되면 모든 클래스에서이 값을 수정해야합니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

데이터베이스 연결을 담당하는 또 다른 개체를 사용하여 ISendBehavior의 각 구현자를 초기화하는 방법은 어떻습니까?

귀하의 Verzenden은() - 구현이

_databaseConnection.Send(...); // fill behavior-specific information here (perhaps with properties) 

이 방법은 다음과 같이 구현 될 것이다)

IDatabaseConnection connection = new DatabaseConnection(); 

SendItem app = new SendItem(new SendAppointment(connection)); 

하고 ISendBehavior.Send (같은 것, 당신은 어떤을 위해 그 IDatabaseConnection을 다시 사용할 수 있습니다 다른 클래스.

+0

응답을위한 Thnx입니다. 나는 정말로 마지막 부분을 얻지 못한다. 따라서 인터페이스의 Send 메서드는 이제 Send (IDatabaseConnection db)와 비슷하게 보입니까? _databaseConnection은 ISendBehavior의 멤버 변수이며 _databaseConnection = db를 보내는 방법의 멤버 변수입니다. 하지만 Send 메서드를 호출하려면 어떻게해야합니까? 그리고 쿼리의 설정은 어디에서해야합니까? – Martijn

+0

예제 코드에서 DatabaseConnection을 SendAppointment-constructor (_databaseConnection 멤버를 설정 함)에 전달합니다. 해당 DatabaseConnection에는 데이터베이스 관련 내용을 저장합니다. 가장 빠른 방법은 연결 문자열 등을 저장하고 SendAppointment 클래스에서 쿼리를 수행하는 것입니다. 이렇게하면 연결 문자열을 한 번만 지정하면됩니다. (가장 깨끗한 방법은 모든 데이터베이스 코드를 추가 클래스에 넣고 SendAppointment가 해당 클래스를 사용하여 데이터베이스 작업을 수행하도록하는 것입니다.) – Lennaert

+0

그래서 가장 깨끗한 방법으로 다른 데이터베이스 클래스를 만들어서 SendAppointment가 그것의 인스턴스. 이렇게하면 SendAppointment()에 매개 변수로 연결을 보낼 필요가 없습니다. 이 메서드에서 인스턴스를 만들기 때문에. 이렇게하면 SendAppointment의 Send 메서드가 모든 쿼리를 만듭니다. 이 올바른지? – Martijn

2

데이터베이스 작업을 위해 다른 추상화 계층을 가질 수 있습니다. 이 계층은 모든 데이터베이스 요청을 액세스를 중앙 집중화하는 책임을 져야합니다. 연결 문자열은 외부에서 구성해야하며 데이터 매핑 계층에서 직접 연결할 수 있습니다.

Repository Pattern은 적용 할 수있는이 레이어의 좋은 패턴입니다. 도메인 개체와 데이터 매핑 계층 사이에 위치 할 수 있습니다.

+0

의사 코드 예제를 줄 수 있습니까? – Martijn

+0

이 기사 http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx가 도움이 될 것입니다. Linq2SQL을 사용하는 경우 : http://geekswithblogs.net/AndrewSiemer/archive/2008/02/05/linq-to-sql---implementing-the-repository-pattern.aspx –

+0

저장소 패턴에 대한 내용을 읽었습니다. , 그러나 나는 이것을 어떻게 내 상황에 적용 할 수 있는지 보지 못한다. 그걸 도와 줄 수있어? – Martijn

0

클래스에 연결을 전달하는 Lennaert 응답을 좋아하지 않으므로 역방향으로 연결하지 않고 간단한 명령 패턴을 사용하는 클래스를 만들고 매개 변수로 클래스를 전달하는 것이 좋을까요?