DAL과 BLL 계층간에 데이터 및 비즈니스 오브젝트 검색 분리


9

이 질문을 게시하기 전에 몇 가지 조사를 수행했습니다. 다른 질문이나 게시물 중 하나가 아래에 제공됩니다. 어떻게 결정해야할지 모르겠다

데이터 액세스 계층 내의 비즈니스 개체

리포지토리가 있고 비즈니스 계층에서 리포지토리를 호출하여 데이터를 검색합니다. 예를 들어, BLL 및 DAL에 대해 다음과 같은 클래스가 있다고 가정하십시오.

class BllCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}

class BllAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

class DalCustomer 
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public int AddressID {get; set;}
}

class DalAddress
{
     public int AddressId {get; set;}
     public String Street {get; set;}
     public String City {get; set;}
     public String ZipCode {get; set; }
}

BLL이 Customer 개체를 검색하려면 DAL에서 GetCustomerById (customerId)를 호출합니다.

다음은 명확한 마음을 가질 수없는 나의 관심사입니다.

  1. DAL의 GetCustomerById가 반환해야하는 개체를 결정하는 방법을 알 수 없습니다. BllCustomer 또는 DalCustomer를 반환해야합니까?

  2. 고객과 관련된 주소의 검색 (및 / 또는 Business Object로 변환)은 어디에 있어야합니까?

DAL이 Dal 개체를 반환하면 Address를 검색하고 채우는 논리는 BLL에만있을 수 있습니다. DAL이 BLL 개체를 반환하면 주소를 검색하고 채우는 논리가 BLL 또는 DAL에있을 수 있습니다. 현재 DAL은 Business Objects를 반환하며이를 채우는 논리는 DAL에 있습니다.

내가 읽은 것에서 옳고 그른 것이 없다고 생각합니다. 위에 포함 된 링크에는 한 가지 방법으로 말하는 사람들이 있고 다른 사람들은 다른 방법으로 말하는 사람들이 있습니다. 그러나 내 사례에 가장 적합한 것을 어떻게 결정합니까?

도움을 주시면 감사하겠습니다.


2
내 첫 번째 질문은 : 이것은 레거시 응용 프로그램입니까? 이러한 종류의 코드를 쓸모 없게 만드는 많은 ORM 프레임 워크가 있으며 이러한 프레임 워크를 고려해야합니다.
JDT

@ JDT 나는 당신이 무슨 뜻인지 잘 모르겠습니다 .Entity Framework를 사용하고 정확히 같은 문제가 있습니다. 알다시피, ORM을 도메인 객체로 사용해서는 안됩니다. 번역은 어디에 있습니까?
pseudocoder

ORM 프레임 워크가 도메인 오브젝트 인 오브젝트를 리턴하지 않는 이유는 무엇입니까?
JDT

3
@JDT ORM (이 경우 EF)은 일반적으로 클래스 당 하나의 데이터베이스 테이블을 나타내는 엔티티 클래스를 리턴합니다. 이것은 일반적으로 도메인 클래스와 유사하지만 반드시 동일하지는 않습니다. ORM 클래스를 도메인 클래스로 사용하는 것이 좋다고 말하는 것일 수 있습니다. 나는 이것이 많은 곳에서 읽지 않았다.
pseudocoder

답변:


5

DAL의 GetCustomerById가 반환해야하는 개체를 결정하는 방법을 알 수 없습니다. BllCustomer 또는 DalCustomer를 반환해야합니까?

그것은 반환해야 DalCustomer의 복귀, 객체를 BllCustomer의 휴식 것이다 오브젝트를 단일 책임 원칙을. DalCustomer 개체를 비즈니스 계층 (또는 소비자)이 사용하는 인터페이스 또는 계약으로 볼 수 있습니다 . 실제로 BllCustomer를 반환 한 경우 DAL 은이 를 호출하거나 잠재적으로 호출 할 수있는 모든 비즈니스 계층 개체를 수용해야합니다.

고객과 관련된 주소의 검색 (및 / 또는 Business Object로 변환)은 어디에 있어야합니까?

변환은 뷰 모델 또는 관리자 에서 수행해야합니다 . 서비스 또는 데이터 액세스 구성 요소를 호출하려면 중개자가 있어야합니다. 필요하다고 생각되면 BllCustomer 개체 에서 변환 할 수 있습니다 . 그러나 DAL을 MSSQL에서 Oracle로 교체 할 때 반환되는 객체 (또는 인터페이스)는 동일하게 유지되어야합니다.

비즈니스 계층도 데이터 계층과 독립적이어야합니다. 비즈니스 계층은 비즈니스 규칙을 담당합니다. 비즈니스 규칙을 시행하기 위해 유효성 검사 프레임 워크를 사용하여 유효성 검사를 추가합니다.


4

리포지토리는 BLL 또는 도메인 개체를 반환해야합니다. DAL 개체가 전혀 필요하지 않을 가능성이 있습니다.

public class Customer
{
    public string Name {get; private set;}
    public Customer(string name)
    {
        this.Name = name;
    }
}

public class Repository
{
    public Customer GetCustomer(string id)
    {
        //get data from db
        return new Customer(datarow["name"]);
    }
}

BLL 또는 별도의 클래스 라이브러리는 Customer? 와 같은 구체적인 클래스 대신 인터페이스를 노출해야합니까 ?
Yola

1
아니요. 구체적인 클래스를 공개하는 것이 좋습니다. 저장소의 인터페이스가 유용합니다
Ewan

3

일반적으로 DAL에는 BLL에 대한 지식이 없습니다. 이런 식으로 생각하면 다른 BLL을 가진 다른 응용 프로그램에서 동일한 DAL을 사용할 수 있습니다. 같은 회사의 Payables 애플리케이션 / 모듈 및 Receivables 앱은 데이터 (클라이언트, 요금, 지불 등)를 공유합니다. 하나의 DLL이 하나 이상의 BLL에 대한 지식을 갖도록 시도하는 것은 매우 어렵고 불필요합니다. 또한 인터페이스를 중단하지 않는 한 BLL에 영향을주지 않고 데이터 스토리지를 변경할 수 있습니다.

이제 DAL 개체를 BLL에 전달하거나 세 번째 개체 집합 인 Entity를 만들 수 있습니다. 여기에는 함께 전달 될 값만 포함됩니다. DAL은 엔터티를 참조하고 스토리지 / 데이터베이스와 상호 작용하며 BLL은 모든 논리를 처리하고 DAL을 참조합니다.

class EntCustomer
{
    public int CustomerId {get; set;}
    public String Name {get; set;}
    public BllAddress Address {get; set;}
}
class BllCustomer
{
   //reference EntCustomer, DalCustomer and handle business rules/logic
}

class DalCustomer 
{
   //reference EntCustomer and interact with data storage
}

당신의 의견에 감사드립니다. 동의합니다 .. 이미 DAL / (리포지토리)에 유형이 A 인 경우와 같이 로직이 채워져 있음을 알 수 있습니다. 그런 다음 테이블 B에서 데이터를 검색하지만 유형이 C 인 경우 테이블에서 데이터를 검색합니다. C. 그러나 EntCustomer를 사용하는 예제와 혼동됩니다. 필자의 경우 DalCustomer는 DB의 테이블 미러입니다. 더 많은 예제, EntCustomer 사용 방법 또는 사용해야하는 이유 및 이점을 제공 할 수 있습니까? DalObjects를 BLL로 반환하도록 DAL을 변경하려고합니다. Bll은 Business Objs 로의 전환을 중단하고 중첩 된 obj를 검색하여 채 웁니다.
ShamirDaj

더 많은 피드백을 제공 할 수 있습니까?
ShamirDaj

Ent 객체의 목적은 DAL과 BLL간에 데이터를 전송하는 것입니다. DAL 클래스는 db 구조를 계속 미러링 할 수 있지만 해당 클래스는 DAL 내부에 있습니다. BLL이 DAL의 데이터를 요청하면 DAL은 데이터베이스 (dalcustomer + daladdress)에서 필요한 DAL 개체를 가져 와서 EntCustomer의 인스턴스를 만들어 BLL로 반환합니다.
artokai

-1

DAL은 DAL에 따라 BL 및 BL과 독립적이어야합니다. UI는 BL을 통해서만 데이터에 액세스해야합니다. DAL에서 DataTable 또는 DataRow를 반환 한 다음 DataTable / DataRow를 BL 개체로 변환하는 것이 좋습니다. UI가 데이터에 액세스해야하는 경우 BL에서 액세스 할 수 있습니다. 따라서 UI는 열 이름 및 데이터베이스 유형 (SQL Server, Oracle ..)과 독립적입니다. 이렇게하면 UI가 DAL과 완전히 독립됩니다. 개인적으로 저는 "CustomerBL"과 같은 클래스 이름을 선호합니다. 클래스 이름을 구걸 할 때 BL 단어를 사용하지 마십시오.

아래는 샘플 코드를 참조하십시오.

//Customer Class
class BllCustomer
{
    public int CustomerId { get; set; }
    public String Name { get; set; }
    public BllAddress Address { get; set; }

    public static BllCustomer GetByCustomerId(int id)
    {
        DataRow dr = DalCustomer.GetByCustomerId(id);
        if (dr == null)
            return null;
        BllCustomer oCust = new BllCustomer();
        oCust.CustomerId = int.Parse(dr["CustomerId"].ToString());
        //Do for other class members and load values

        return oCust;
    }
}


class DalCustomer
{

    public static DataRow GetByCustomerId(int id)
    {
        //Get Data row from Database and return Datarow
        DataRow CustomerRow = GETFROMDATABASE("SELECT * from CUSTOMER");
        return CustomerRow;
    }
}

오류 ... 그렇다고 BLL이 데이터 테이블의 형식 / 구조에 대한 지식이 필요하다는 의미는 아닙니까?
Paul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.