n 계층 응용 프로그램을 개발 중이며 데이터 액세스 계층에서 리포지토리 패턴을 사용하기로 결정했지만 ORM을 사용하지 않으려합니다. ADO .net)엔티티 프레임 워크를 사용하지 않고 리포지토리를 사용하는 데이터 액세스 계층 디자인
(부모 자식 관계가 아닌) 2 개의 entites간에 관계가있는 저장소에서 데이터를 가져 오는 방법을 결정할 수 없습니다. 예 : 고객 및 주문 테이블이 있습니다. "고객"테이블에 연결된 "주문"테이블에 "고객 ID"열이 있습니다. 나는 OrderID를 기반으로 주문
정보 (단일 또는 복수)를 가져 오는 동안 오전
- 어떻게 고객 정보를 가져?
- 하나의 저장소 인스턴스를 다른 인스턴스에 작성할 수 있습니까?
아래는 현재 코드 구조입니다.
///////////// 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; }
}
당신이 무엇을 : 질문에 대한 솔루션은이 같은 것 예를 들어 (공장을 가정하는 것은 일반적으로 주입 전용 필드입니다) "모든 ORM"대신에 사용 하시겠습니까? 올바른 태그를 적용하십시오. 질문에 인라인 코드 (부분)를 게시하면 해당 링크가 잠시 후에 죽습니다. –
예; ORM을 사용하지 않고 이러한 디자인을 구현할 수 있습니다. 그러나 그것은 많은 작업이 될 것이며 결국 다른 ORM이 한 일을 마칠 것입니다. 나는 바퀴를 재발 명하지 말 것을 권한다. Dapper와 같은 경량 마이크로 ORM을 사용해보십시오. –
@AmitJoshi ORM을 다시 디자인하지 않습니다. 백엔드에서는 CRUD 작업을위한 저장 프로 시저를 작성합니다. 디자인 원칙에 따라 현재 코드 구조를 개선하고 싶습니다. –