2013-08-28 3 views
2

우리는 기존 DAL을 EF 4.0에서 EF 5.0으로 업그레이드 할 것입니다.
현재 일반적인 저장소 패턴이 이미 구현되어 있으며 POCO 개체를 비즈니스 엔티티로 사용하고 있습니다.
이러한 개체는 웹 서비스 인터페이스에서 전달되고 이후 비즈니스 및 유효성 검사 메서드를 추가하기 위해 부분 클래스로 확장되므로 WCF 특성으로 장식되어 있습니다. 또한 각 POCO 엔티티는 제네릭 리포지토리 메소드를 쉽게 사용하기 위해 "BusinessEntity"기본 클래스와 "IBusinessEntity"인터페이스를 상속합니다.비즈니스 개체를 POCO (개체 프레임 워크) 개체에서 분리해야하는 필요성?

비즈니스 개체를 POCO 개체에서 분리하여 속성 및 논리 만있는 일반 클래스로 만들 계획입니다.

그러나 주제에 관해 읽은 후에는 현재 예술 상태가 코드 우선 접근 방식을 채택하고 도메인 엔터티를 직접 유지하는 것으로 보입니다 (물론 모든 경우에 대해 일반화 할 수는 없지만).
Related answer 1, related answer 2.

우리의 경우 비즈니스 로직을 사용하여 POCO 객체를 유지하고 EF 5.0 (DbContext)과 관련된 변경 사항 만 적용하는 것이 합리적입니까? 아니면 저장소 내부에 매핑 레이어를 도입해야합니까? 이런 방식으로 애플리케이션은 비즈니스 엔티티에서 작동 할 것이고 저장소 계층은 외부에서 POCO 객체를 숨길 것입니다. 그러나 단점은 복잡성의 도입, 특히 일반적인 저장소를 다룰 때입니다.

미리 감사드립니다.

+1

비슷한 문제가 있었지만 답변 중 일부가 사용되었을 수 있습니다. http://stackoverflow.com/questions/11521192/placement-of-dto-poco-in-a-three- tier-project – GrandMasterFlush

+0

게시물에 대해 GrandMasterFlush에 감사드립니다. 그러나 POCO에서 비즈니스 객체를 매핑하는 데 어떤 접근 방식을 사용 했습니까? (만약 당신이 결국이 결정을 내리면). – Francesco

+0

EF 모델을 읽고 WCF 특성으로 표시된 POCO의 데이터를 전달하는 WCF 서비스에서 호출 한 컨트롤러 클래스를 사용했습니다. 매우 큰 웹 사이트가 아니기 때문에 이것은 의미가있는 것처럼 보였습니다. – GrandMasterFlush

답변

1

귀하의 질문에 대한 귀하의 경험을 공유하고 싶습니다. 그러나 다른 관련 문제에 대한 해결책을 찾았습니다.

내가 읽은 대부분의 사람들과 기사는 비즈니스 객체로 EF POCO를 사용한다고 말하고 있습니다 ... EF가 이러한 경향을 일으키는 것처럼 보입니다. 분리하려는 경우 개발이 더 복잡해질 수 있기 때문입니다.

당신은 이미 시스템에 POCO가있는 EF가 있다고하셨습니다. 우리는 DAL이 순수 ADO.NET 및 자체 비즈니스 클래스로 작성된 자체 기본 '데이터베이스 처리기'를 사용하는 프로젝트를 가지고 있습니다. 하지만 이제 우리는 Entity Framework도 지원하려고합니다. (그래서 우리는 오래된 db 핸들러 나 EF 중 하나를로드합니다 ... 아마도 나중에 우리는 EF로 전환 할 것입니다). 우리는 데이터베이스를 그대로 유지하기 때문에 데이터베이스 우선 접근법을 사용합니다. 지금 우리는 기존 비즈니스 객체와 POCO 사이의 연결을 쉽게 할 수있는 방법을 찾지 못했습니다 (우리는 현재 변환을 위해 간단한 '투영법'을 사용합니다). List<BObject2>

그래서, BL에서 다음 preudo 코드가 삽입 한 BObject1 (1 : N 관계는) 다음과 같습니다

this.UnitOfWork.ExecuteTransaction(() => 
{ 
    bObject1_Repository.InsertBObject1(bObject1); 

    foreach (var bObject2 in bObject1.ListBObject2) 
     bObject2_Repository.InsertBObject2(bObject2); 
}); 

모두는 우리의 오래된 'DB 핸들러'에 대한 좋은; 우리는 동일한 거래와 암묵적으로 동일한 연결을 재사용합니다 ... 그러나 EF에 대해서는 매우 까다 롭습니다. bObject2를 삽입하려면 먼저 자동 생성을 원할 수 있습니다. bObject1의 UID (첫 번째 삽입 후에 이미 알려짐) ... 처음 삽입 한 후 SaveChanges를 미리 호출하지 않는 한 EF에서는 사용할 수 없습니다. 둘 이상의 'SaveChanges'호출이 포함되는 즉시 이러한 트랜잭션이 어떻게되는지 생각해야합니다. 분산 트랜잭션 (DTC)은 하나의 딸꾹질 일 수 있습니다 ... 이것은 오라클 데이터베이스를 지원하고자 할 때 우리 프로젝트의 경우입니다 ... 실제로 우리는 여기에 머물러 있습니다.

다른 각도에서도 볼 수 있도록 노력하겠습니다.이외에도

주의 :

는 EF와 오라클은 BL에서 거래의 사용에 관한 경험이있는 사람의 의견을 듣고 좋을 것이다 그것은 my question으로도 나를 도울 수 있습니다.

+0

게시자님께 감사드립니다. 우리는 2 개월 전에 Oracle에서 SQL Server로 전환했습니다. 그 전에 호환성 문제로 인해 EF 4.0을 사용해야했습니다. 현재 아키텍처는 오라클과 동일하지만 이제는 EF 5.0 및 DbContext로 업그레이드하려고합니다. – Francesco

+0

@ 루카 : EF로 오라클을 이미 사용 했으므로 에스컬레이션/스패닝에 관한 문제는 없었습니까? DAL을 사용하기 위해 BL을 구성하는 방식을 공유 하시겠습니까? – Learner

+0

분산 트랜잭션이 없었기 때문에 복잡성은 매우 낮았습니다. 어떤 경우에는 DAL 내부에 UnitOfWork 패턴을 도입하여 피하려고 시도하는 중첩 트랜잭션과 관련된 문제가있었습니다. BL은 일반 인터페이스의 객체를 전달하여 저장소와 함께 작동합니다. 특정 유형은 런타임시 실사를 통해 해결되므로 일반 메소드를 사용하고 경계를 줄일 수 있습니다. – Francesco

관련 문제