2014-04-15 3 views
0

이것은 내 ASP.NET 웹 응용 프로그램에 사용하는 현재 디자인 패턴입니다. 저장소를 사용하는 사람들을 보았지만 저장소 디자인 패턴 구현을 얻지 못했습니다.ASP.NET 저장소 디자인 패턴

내 디자인에서 저장소 패턴을 구현하는 방법을 알아낼 수 있습니까? 또한 저장소에 구현하면 얻을 수있는 이점은 무엇입니까?

또한 설계시 구현해야하는 인터페이스를 잘 사용하고 있습니까?

고객 클래스 (Customer.cs)

public class Customer 
{ 
    public int CustomerID { get; set; } 
    public string Name { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
} 

DBManager 클래스 (DBManager.cs)

public class DBManager 
{ 
    private const string connectionString = "some connection string"; 

    public static IEnumerable<Customer> getAllCustomers() 
    { 
     List<Customer> cust = new List<Customer>(); 

     try 
     { 
      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       conn.Open(); 

       string cmdText = "SELECT * FROM Customer"; 
       SqlCommand comm = new SqlCommand(cmdText, conn); 
       SqlDataReader dr = comm.ExecuteReader(); 

       while (dr.Read()) 
       { 
        cust.Add(new Customer 
        { 
         CustomerID = int.Parse((string)dr["customerID"]), 
         Name = (string)dr["name"], 
         Address1 = (string)dr["address1"], 
         Address2 = (string)dr["address2"] 
        }); 
       } 
      } 
     } 
     catch (SqlException e) 
     { 
      throw e; 
     } 

     return cust; 
    } 
} 

색인 페이지의 코드 숨김 (index.aspx.cs)

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     IEnumerable<Customer> cust = DBManager.getAllCustomers(); 

     // some codes to display IEnum customers in page 
    } 
} 

답변

5

귀하의 DBManager는 자체적으로 저장소 패턴과 매우 비슷합니다. Domain Driven Design의 세계에서는 일반적으로 마틴 파울러 (Martin Fowler)의 설명과 같이 도메인을 찾은 집계 루트마다 리포지토리가 만들어집니다.
당신이 CRUD 작업을 (만들기, 읽기, 업데이트 및 삭제) 처리 할 저장소를 작성 할 도메인에서 다루는 각 법인/집계 루트를 들어 http://martinfowler.com/bliki/DDD_Aggregate.html

. 따라서 귀하의 경우 고객 저장소를 보유 할 수 있습니다.

편집 : 데이터를 어떻게 수정하고 작동하는지 구현하는 것이 나머지 코드에서 추상화된다는 이점이 있습니다. 그런 다음 저장소의 메소드를 호출하여 코드를 읽기 쉽게 만들 수 있습니다. 또한 리포지토리를 인터페이스로 구현하면 Dependency Injection과 같은 것을 사용하기 시작할 수 있습니다. 그러면 코드를 유지 관리하기 쉽고 테스트 할 수있는 기타 기능으로 사용할 수 있습니다. ;-) C#에서

전형적인 저장소 인터페이스는 조금 다른 사용자의 요구에 따라 할 수 있습니다 분명히 (이 같은 것을 보일 것이다.

public interface ICustomerRepository : IDisposable 
{ 
    IEnumerable<Customer> GetCustomers(); 
    Customer GetCustomerByID(int customerId); 
    void InsertCustomer(Customer customer); 
    void DeleteCustomer(int customerId); 
    void UpdateCustomer(Customer customer); 
    void Save(); 
} 

좋은 자원이에 대한 자세한 학습을위한 MSDN에서 찾을 수 있습니다 . 예는 MVC와 엔티티 프레임 워크를 사용하고 있지만, 분명히 응용 프로그램에 대한 불통 될 수있다.

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

+0

내가 저장() 메소드에서 의미를 만들기 위해 노력하고있어. 이제 내가 InsertCustomer 전화를 가정 해 봅시다 경우 , 고객은 실행 종료 시점에 이미 내 데이터베이스에 삽입됩니다. 왜 Save() 메소드가 필요합니까? – InnovativeDan

+2

구현에 따라 다릅니다. 대부분의 경우 저장소 패턴은 작업 단위 (UoW) 패턴과 함께 설정됩니다. 이 경우 데이터 저장소 (이 경우 DB)의 각 작업에 대해 UoW 내에서 연결 인스턴스를 만들고 해당 연결을 리포지토리에 전달합니다. 리포지토리에서 작업이 완료되면 UoW는 각각에 Save() 메서드를 호출합니다. 무언가가 작동하지 않으면 트랜잭션을 커밋 할 수 없으며 롤백도 수행 할 수 있습니다. 그러나 당신이 지적한대로, 그것은 생략 될 수 있습니다. – jensendp

+0

감사합니다. 답변으로 표시. – InnovativeDan