우리가
- 높은 수준의 모듈은 낮은 수준의 모듈에 의존해서는 안 종속성 반전 원칙을 따르십시오. 둘 다 추상화에 의존해야합니다.
- 추상화는 세부 사항에 의존해서는 안됩니다. 세부 사항은 추상화에 따라 달라야합니다.
그래서 귀하의 경우 UI
및 Business logic
에 Data access
에 의존해서는 안된다. 추상화 된 개체는 우리가
1 프로젝트 비즈니스 로직을 추상화 만들기
public interface ICustomer
{
int Id { get; set; }
}
2 개체 추상화의 프로젝트 만들기 높은 수준의 계층에서 우리의 응용 프로그램을 설계 시작 다음 LINQ to SQL
의 세부 사항에 의존해서는 안 UI 프로젝트에서 사용됨
public interface ICustomerService
{
List<ICustomer> LoadTop50();
}
UI는 추상화에 따라 다른 층에 대한 지식이 없다 :3 개인 정보를
주의 사항을 표시하기위한 ICustomer
및 ICustomerService
을 사용하여 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에서 사용하려는 고객의 새 데이터 필드를 추가하려는 경우 종속성의 전체 체인을 수정해야합니다.
DTO가 분리 된 프로젝트 인 "Entities project"에 슬픈 경우. 따라서 UI는 Entities 프로젝트에 대한 참조 만 필요합니다. 그럼 DataAccess와 UI 프로젝트는 엔티티 프로젝트를 서로 참조하지 않고 참조 할 것입니다 – Fabio
저는 UI 프로젝트와 데이터 액세스 프로젝트에 대해 슬퍼하지 않습니다. 서로 어떻게 작동하는지에 대한 지식이 필요하지 않습니다. 나는 이것이 좋은 것이라고 생각한다. 내 UI 프로젝트는 데이터베이스가 MySQL 또는 SQL Server 대신 DB2로 전환 된 경우에도 참조가 변경되지 않아도 변경이 필요하지 않습니다. 왜 UI의 새로운 버전을 클라이언트에 제공해야합니까? 물론 누구나 DTO에 대한 참조가 있어야합니다. –
그럼 궁금한 점은 무엇입니까? 'UI'는 필요한 행동과 데이터를 추상화합니다. 'Businees logic'은'UI'의 추상화를 구현하고 필요한 데이터 서비스를 추상화합니다. '데이터 접근'은'Businees logic'의 서비스 추상화를 구현할 것이다. 'DTO 프로젝트'는'UI' 데이터 모델 추상화를 구현하고 가능하다면 엔티티로서'데이터 액세스'에 의해 사용되거나'데이터 액세스'엔티티와 데이터 모델 추상화 사이에 어떤 매핑을 생성합니다.이 방식으로 상위 계층에서 세부 계층으로 세부 계층을보다 쉽게 변경할 수 있습니다. – Fabio