2016-09-30 15 views
0

내 경험으로 인해 내 프로그램에서 다음 구조에 익숙해졌습니다. NET WPF 응용 프로그램이라고 가정 해 보겠습니다. WPF 프로젝트, 비즈니스 로직 프로젝트 (클래스 라이브러리), 데이터 액세스 프로젝트 (클래스 라이브러리) 및 엔티티 프로젝트 (클래스 라이브러리)를 만듭니다. WPF 프로젝트는 비즈니스 로직 레이어를 통해 데이터 액세스 레이어로 이동합니다. Entities는 경량의 DTO이며 레이어간에 자유롭게 이동할 수 있습니다.LINQ to SQL 및 N 계층 계층화

내 질문은 여기 있습니다. LINQ to SQL 엔티티가 마음에 들지만 엔티티를 생성하는 데 사용하는 경우를 제외하고 엔티티 관계에 대한 직선 테이블로 끝날뿐만 아니라 내 엔티티를 데이터 액세스 프로젝트에두고 내 UI 프로젝트에 대한 참조가 필요합니다. 내 데이터 액세스 프로젝트. 내 DTO가 여전히 데이터 액세스 프로젝트에 있고 내 데이터 프로젝트에 내 데이터 프로젝트에 대한 참조가있는 경우를 제외하고 내 DataContext를 내부적으로 만들 수 있습니다 (기본적으로 여하튼 그렇다고 생각합니다).

여기에 뭔가가 누락되었거나 LINQ to SQL을 사용하여 DTO를 구출 할 수있는 또 다른 방법이 있습니까?

+1

DTO가 분리 된 프로젝트 인 "Entities project"에 슬픈 경우. 따라서 UI는 Entities 프로젝트에 대한 참조 만 필요합니다. 그럼 DataAccess와 UI 프로젝트는 엔티티 프로젝트를 서로 참조하지 않고 참조 할 것입니다 – Fabio

+0

저는 UI 프로젝트와 데이터 액세스 프로젝트에 대해 슬퍼하지 않습니다. 서로 어떻게 작동하는지에 대한 지식이 필요하지 않습니다. 나는 이것이 좋은 것이라고 생각한다. 내 UI 프로젝트는 데이터베이스가 MySQL 또는 SQL Server 대신 DB2로 전환 된 경우에도 참조가 변경되지 않아도 변경이 필요하지 않습니다. 왜 UI의 새로운 버전을 클라이언트에 제공해야합니까? 물론 누구나 DTO에 대한 참조가 있어야합니다. –

+0

그럼 궁금한 점은 무엇입니까? 'UI'는 필요한 행동과 데이터를 추상화합니다. 'Businees logic'은'UI'의 추상화를 구현하고 필요한 데이터 서비스를 추상화합니다. '데이터 접근'은'Businees logic'의 서비스 추상화를 구현할 것이다. 'DTO 프로젝트'는'UI' 데이터 모델 추상화를 구현하고 가능하다면 엔티티로서'데이터 액세스'에 의해 사용되거나'데이터 액세스'엔티티와 데이터 모델 추상화 사이에 어떤 매핑을 생성합니다.이 방식으로 상위 계층에서 세부 계층으로 세부 계층을보다 쉽게 ​​변경할 수 있습니다. – Fabio

답변

0

우리가

  • 높은 수준의 모듈은 낮은 수준의 모듈에 의존해서는 안 종속성 반전 원칙을 따르십시오. 둘 다 추상화에 의존해야합니다.
  • 추상화는 세부 사항에 의존해서는 안됩니다. 세부 사항은 추상화에 따라 달라야합니다.

그래서 귀하의 경우 UIBusiness logicData access에 의존해서는 안된다. 추상화 된 개체는 우리가

1 프로젝트 비즈니스 로직을 추상화 만들기

public interface ICustomer 
{ 
    int Id { get; set; } 
} 

2 개체 추상화의 프로젝트 만들기 높은 수준의 계층에서 우리의 응용 프로그램을 설계 시작 다음 LINQ to SQL

의 세부 사항에 의존해서는 안 UI 프로젝트에서 사용됨

public interface ICustomerService 
{ 
    List<ICustomer> LoadTop50(); 
} 
UI는 추상화에 따라 다른 층에 대한 지식이 없다 :

3 개인 정보를

주의 사항을 표시하기위한 ICustomerICustomerService을 사용하여 UI 로직을 작성 UI 프로젝트

3.1을 만듭니다.

4 만들기 비즈니스 프로젝트

4.1 가져 오는 데이터

namespace Business.DataAccessAbstractions 
    { 
     public interface ICustomerDataAccess 
     { 
      List<ICustomer> Load(int topAmount); 
     } 
    } 

4 DataAccess 추상화를 만듭니다.2 ICustomerDataAccess

public class CustomerService : ICustomerService 
{ 
    private DataAccessAbstractions.ICustomerDataAccess _dataAccess; 

    public CustomerService(DataAccessAbstractions.ICustomerDataAccess dataAccess) 
    { 
     _dataAccess = dataAccess; 
    } 

    public IEnumerable<ICustomer> LoadTop50() 
    { 
     const int TOP_NUMBER = 50; 
     return _dataAccess.Load(TOP_NUMBER); 
    } 
} 

공지 사항의 추상화를 사용 ICustomerService 구현 : Business 프로젝트는 데이터 액세스를위한 추상화를 만들 수 있습니다. UI가 데이터 표시에 사용할 추상화를 구현합니다.

5

5.1 LINQ to SQL로 엔티티를 생성 DATAACCESS 프로젝트를 만듭니다.

5.2 Business.DataAccessAbstractions.ICustomerDataAccess 인터페이스를 구현하십시오.

5.2.1 당신이 필요로하는 경우에만 구현 된 인터페이스의 목록에 ICustomer를 추가 ICustomer

[Table(Name="dbo.Customer")] 
    public partial class Customer : INotifyPropertyChanging, 
            INotifyPropertyChanged, 
            ICustomer 
    { 
     private int _Id; 

     [Column(Storage="_Id", 
       AutoSync=AutoSync.OnInsert, 
       DbType="Int NOT NULL IDENTITY", 
       IsPrimaryKey=true, 
       IsDbGenerated=true)] 
     public int Id 
     { 
      get 
      { 
       return this._Id; 
      } 
      set 
      { 
       if ((this._Id != value)) 
       { 
        this.OnIDChanging(value); 
        this.SendPropertyChanging(); 
        this._Id = value; 
        this.SendPropertyChanged("Id"); 
        this.OnIDChanged(); 
       } 
      } 
     } 
    } 

구현, LINQ to SQL에 의해 생성 된 개체를 확인합니다. 또는 LINQ to SQL에 의해 생성 된 엔티티를 ICustomer의 인스턴스로 변환하는 "매핑 논리"를 생성/생성하십시오. 나는이 샘플을 위해 ICustomer을 추가하는 것이 가장 쉬운 방법이라는 것을 발견했다.

주의 사항 : DataAccess 프로젝트는 LINQ to SQL

6 당신의 UI를 함께 모든 종속성을 복잡하게하고 시작합니다 홈페이지 프로젝트 만들기 사용하여 구현에만 추상화에 의존성을 가지고있다.

알림 :이 프로젝트에는 응용 프로그램이 제대로 작동하는 데 필요한 모든 참조가 있습니다. 당신 UI가 LINQ to SQL의 세부 사항에 의존하지 않습니다이 방법으로

요약

.

수정하면 높은 수준의 추상화가 깨지지 않을 때까지 DataAccess 구현을 자유롭게 수정할 수 있습니다.

물론 UI에서 사용하려는 고객의 새 데이터 필드를 추가하려는 경우 종속성의 전체 체인을 수정해야합니다.