2016-08-17 3 views
0

데이터 액세스에 EF를 사용하는 WCF 서비스 응용 프로그램에서 작업하고 있습니다. DataLayer의 모든 EF 모델. 이 "유형 'DBContext이': 그것은 나에게 다음과 같은 오류를 제공EntityFramework를 사용하는 WCF 서비스에서 "유형 'DBContext'가 참조되지 않은 어셈블리에 정의되었습니다."

using (var context = DataObjectFactory.CreateTRAContext()) 
      { 
       var objClients = from r in context.TRAEmployee 
           orderby r.id 
           select r; 
      } 

: 나는 다음과 같은 코드를 사용하는 것을 시도하고 비즈니스 계층에서 데이터 계층

namespace TRA.Services.DataAccessLayer 
{ 
    public static class DataObjectFactory 
    { 
     public static TRAEntities CreateTRAContext() 
     { 
      return new TRAEntities(); 
     } 
    } 
} 

에서 다음 팩토리 메소드를 만들었습니다 어셈블리에 대한 참조를 추가해야합니다. 'EntityFramework, Version = 6.0.0.0, ......'어셈블리에 대한 참조를 추가해야합니다.

Sinc e 비즈니스 계층에서이 코드를 사용하고 있는데 EntityFramework에 대한 참조를 추가하고 싶지 않습니다.

이 시나리오를 처리하는 방법이 있습니까?

+0

참조가 추가되어야합니다. WCF 서비스를 포함하는 프로젝트가 일반적으로 계층 구조의 최상위 프로젝트이므로이 작업을 수행 할 때마다 많은 어려움을 겪지 않아야합니다. –

+0

@Wiktor OP는 일반적으로 WCF 서비스 계층에서 호스트되고 호출되는 별도의 어셈블리 인 비즈니스 계층에 대해 이야기합니다. – CodeCaster

답변

1

어셈블리의 클래스 멤버 (public static TRAEntities의 경우 TRAEntities : DbContext)에서 공개적으로 노출하는 유형의 상속 트리에있는 모든 유형은 해당 멤버를 사용하려는 어셈블리를 참조해야합니다.

비즈니스 계층에서 DataObjectFactory.CreateTRAContext()을 노출하고 해당 메서드에서 반환 된 형식이 Entity Framework의 DbContext에서 상속되므로 비즈니스 계층에 Entity Framework에 대한 참조가 필요합니다.

간접 참조 계층을 도입하여이 문제를 해결할 수 있습니다.이 경우 일반적으로 일부 저장소 계층을 통해 수행됩니다. 또한 Entity Framework를 조롱하지 않고도 비즈니스 계층을 테스트 할 수 있습니다.

그래서 그 대신 데이터 계층에서 DbContext 당기는와 DbSet<T> 회원에 접근, 당신은 다시 액세스하려는 엔티티를 노출 저장소를 노출 :

public interface IRepository<T> 
{ 
    IQueryable<T> Entries(); 
} 

이 저장소의 구현은 내부에 데이터 레이어를 포함하고 DbSet<T> DbContext.Set<T>을 래핑합니다.

+0

이 접근법에 대한 단계별 구현을 제공하는 기사에 대한 링크를 제공 할 수 있습니까? –

+0

Entity Framework에서 리포지토리 패턴을 사용하면 (또는 수행하지 않는 이유) 웹에서 매우 철저하게 문서화되므로 단일 사이트를 추천 할 수 없습니다. 검색해보십시오. – CodeCaster

0

여기의 문제는 더 많은 개념적 특성입니다. 층 사이의 추상화가 중요한 경우

IEnumerable<Employee> GetEmployees() 
{ 
    IEnumerable<Employee> employees; 

    using (var context = DataObjectFactory.CreateTRAContext()) 
    { 
     employees = from r in context.TRAEmployee 
        orderby r.id 
        select r; 
    } 

    return employees; 
} 

또한,하는 구현 : 대신 TRAEntities의 인스턴스를 반환하는 메서드를 노출, 당신은 그와 같이, bsuness 로직 계층에 직원 목록을 반환하는 Accessor을 만들어야합니다 데이터 액세스 레이어에서 데이터를 이동시키는 Employee 엔티티를 분리합니다.

관련 문제