2017-05-20 17 views
0

n 계층 응용 프로그램을 개발 중이며 데이터 액세스 계층에서 리포지토리 패턴을 사용하기로 결정했지만 ORM을 사용하지 않으려합니다. ADO .net)엔티티 프레임 워크를 사용하지 않고 리포지토리를 사용하는 데이터 액세스 계층 디자인

(부모 자식 관계가 아닌) 2 개의 entites간에 관계가있는 저장소에서 데이터를 가져 오는 방법을 결정할 수 없습니다. 예 : 고객 및 주문 테이블이 있습니다. "고객"테이블에 연결된 "주문"테이블에 "고객 ID"열이 있습니다. 나는 OrderID를 기반으로 주문
정보 (단일 또는 복수)를 가져 오는 동안 오전

  1. 어떻게 고객 정보를 가져?
  2. 하나의 저장소 인스턴스를 다른 인스턴스에 작성할 수 있습니까?

아래는 현재 코드 구조입니다.

///////////// Abstract Class for Common Functionality//// 
public abstract class BaseRepository<T> where T : class 
{ 
    private static SqlConnection sqlConnection; 
    protected string DatabaseName { get; set; } 
    protected string ConnectionString; 
    public delegate T CallBack(SqlDataReader reader); 

    public BaseRepository() 
    { 
     ConnectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["TestDB"]); 
     sqlConnection = new SqlConnection(ConnectionString); 
    } 

    protected abstract T PopulateRecord(SqlDataReader reader); 

    protected IEnumerable<T> GetRecords(SqlCommand command) 
    { 
     var list = new List<T>(); 
     using (SqlConnection connection = new SqlConnection(ConnectionString)) 
     { 
      command.Connection = connection; 
      connection.Open(); 

      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       if (reader != null) 
       { 
        while (reader.Read()) 
        { 
         list.Add(PopulateRecord(reader)); 
        } 
       } 
      } // reader closed and disposed up here 
     } //connection closed and disposed here 
     return list; 
    } 

} 

////////////////// Repository Class ////////////////////////// 

public class OrderRepository : BaseRepository<Order>, IRepository<Order> 
{ 
    protected override Order PopulateRecord(SqlDataReader reader) 
    { 
     return new Order 
     { 
      OrderID = reader.GetIntVal("OrderID"), 
      OrderDate = reader.GetDateTimeVal("OrderDate"), 
      ProductInfo= // How to Populate Product Information which is in another repository 
      CustomerInfo = // How to Populate Customer Information which is in another repository 
     }; 
    } 

    public IEnumerable<Order> GetAll() 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "GetOrders"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     return GetRecords(cmd); 

    } 

} 

/////////////// Entity Class //////////////////// 
public class Order { 

    public int OrderID { get; set; } 
    public DateTime OrderDate { get; set; } 
    public Customer ProductInfo { get; set; } 
    public Product CustomerInfo { get; set; } 
} 

public class Customer { 

    public int CustomerID { get; set; } 
    public string CustomerName { get; set; } 
} 

public class Product { 

    public int ProductID { get; set; } 
    public string ProductName { get; set; } 
} 
+0

당신이 무엇을 : 질문에 대한 솔루션은이 같은 것 예를 들어 (공장을 가정하는 것은 일반적으로 주입 전용 필드입니다) "모든 ORM"대신에 사용 하시겠습니까? 올바른 태그를 적용하십시오. 질문에 인라인 코드 (부분)를 게시하면 해당 링크가 잠시 후에 죽습니다. –

+0

예; ORM을 사용하지 않고 이러한 디자인을 구현할 수 있습니다. 그러나 그것은 많은 작업이 될 것이며 결국 다른 ORM이 한 일을 마칠 것입니다. 나는 바퀴를 재발 명하지 말 것을 권한다. Dapper와 같은 경량 마이크로 ORM을 사용해보십시오. –

+0

@AmitJoshi ORM을 다시 디자인하지 않습니다. 백엔드에서는 CRUD 작업을위한 저장 프로 시저를 작성합니다. 디자인 원칙에 따라 현재 코드 구조를 개선하고 싶습니다. –

답변

0

이전 동료와 나는 저장소 패턴을 구현하는 SqlRepo를 만들었습니다.

삽입 된 팩토리에서 저장소를 얻은 후에는 명령을 작성하고 유창한 API 및 표현식을 사용하여 실행하여 엔터티를 반환합니다.

단위 테스트가 그 자체만으로도 훌륭한 문서를 만들었지 만, 문서 작업은 여전히 ​​진행 중이지만 질문에 대답하는 것은 매우 행복합니다.

http://github.com/testpossessed/sqlrepo

UPDATE 살펴를 인수 :

var customerRepository = this.repositoryFactory.Create<Customer>(); 
var customer = customerRepository.Query() 
           .Where(e => e.Id == 123) 
           .Go(); 

var orderRepository = this.repositoryFactory.Create<Order>(); 
customer.Orders = orderRepository.Query() 
           .Where(e => e.CustomerId == 123) 
           .Go(); 
+0

필자는 위에서 작성한 코드가 Repository 나 Bussiness Layer에 있어야한다고 말씀해 주시겠습니까? (그런데 데이터에 액세스하기 위해 일반 ADO.net을 사용하고 있습니다). –

+0

나는 비즈니스 계층을 말할 것이라고 생각한다. 보통이 코드를 포함하는 UnitOfWork 구성 요소를 구현 한 다음 컨트롤러 또는보기 모델과 같은 다른 구성 요소에 주입합니다. – testpossessed

+0

리포지토리 자체에 내 도메인 개체를 채우고 싶습니다. –