2014-11-28 3 views
0

나는 의존성 주입과 관련하여 도움을 요청하고 싶습니다. 건축 적 접근입니다.맞춤 Api에서 EF6 디커플링

그래서 개체가 설명되어 있고 Ef가 비즈니스 등을 수행하는 EF6에 의해 구현 된 ORM 계층이 있습니다.이 개체 위에 DatabaseApi라는 사용자 지정 라이브러리가 만들어졌으며 제목에 "Api" 여기서 데이터를 쿼리하고 데이터를 객체에 연결하는 데 매핑합니다. 순수한 테스트 목적으로 사용합니다. 내 응용 프로그램에서 다른 라이브러리를 테스트 할 수있게하고 싶습니다.

DbContext를 삽입하는 코드를 구현하기 시작했지만이 경우 사용 방법을 어떻게 처리해야할지 모르겠다.

나는 조롱과 EF, 특히 this one에 관한 몇 가지 블로그 게시물과 기사를 읽었지만 다른 라이브러리에서 그것을 분리하는 방법이 아니라 EF 자체를 테스트하는 것이 었습니다. 반면에 검색 키워드는 적절하지 않다고 가정합니다.

엔티티 프레임 워크를 다른 라이브러리에서 분리하는 방법에 대한 유용한 자습서와 기사를 알고 있습니까?

미리 감사드립니다.

예 :

나는 주사가 될 수 DbContext하기 위해 빈 인터페이스를 만들었습니다. 이것은 databaseContext에 의해 구현됩니다. 사용자 정의 API 광고 라이브러리 생성자에서
public interface IDatabase 
{ 
} 

public class DatabaseModelContext : DbContext, IDatabase{ 

    public DbSet<TableOne> TableOne { get; set; } 
    public DbSet<TableTwo> TableTwo { get; set; } 

} 

나는 단결하여 인터페이스를 해결하기 위해 함께 코드를 넣습니다. 그것이 작동하는지 아닌지 나는 모른다. 나는 아직 처형하지 않았다. 여기
public partial class DatabaseApi : IDatabaseApi { 
    private readonly IDatabase iDatabase; 

    private readonly UnityContainer unityContainer; 

    public DatabaseApi() 
    { 
     this.unityContainer = new UnityContainer(); 
     this.unityContainer.RegisterType<IDatabase, DatabaseModelContext>(); 
     this.iDiLibDatabase = this.unityContainer.Resolve<IDiLibDatabase>(); 
    } 
} 

그리고

문제입니다. 주입으로 인해 인터페이스를 사용할 수 있지만, 알고있는 한 리소스를 관리하는 데 중요한 사용법이 있습니다. 그것을하는 방법?

public partial class DatabaseApi : IDatabaseApi 
    { 
     public List<SomeDataContract> GetMainStructure() 
     { 
      var result = new List<SomeDataContract>(); 

      //this is the old implementation 
      using (var database = new DatabaseModelContext()) 
      { 
       //some data manipulation magic... :) 
      } 
      return result; 
     } 
+1

당신은 IDatabase''에서'IDbSet '회원을 선언하고 명시 적으로 구현할 수 있습니다. 'using ... dispose'의 경우, 일회용 객체를 처리하는 IOC 컨테이너를 사용해야합니다. Unity는 이것을 상자에서 꺼내지는 않지만, Unity를 검색하면 거기에 Unity를위한 'TransientDisposableLifetimeManager' 구현이 있습니다. 나는 다른 IOC 컨테이너에 대해 모른다. –

+0

Keith, 제안에 감사드립니다. 당신의 제안에 따라 AutoFac과 흥미로운 기사, 튜토리얼을 발견했습니다. 감사! 내 문제에 대한 해결책을 찾았습니다! :) http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc https://github.com/autofac/Autofac 에 http : // WWW. codeproject.com/Articles/25380/Dependency-Injection-with-Autofac – SayusiAndo

+0

Keith, 내가 찾은 해결책으로 답을 표시하려면 어떻게해야합니까? – SayusiAndo

답변

1

당신이 다음 일 것이다 실체에 대한 접근을 IQueryable를 노출 도메인 액세스 레이어의 핵심 요소로 개체에 LINQ를 사용 괜찮다면 ... 그와

public interface IRepository<TEntity> 
{ 
    IQueryable<TEntity> AllEntities { get; } 
} 

EF에 하드 배선없이 직접 Where, Select 등을 할 수 있습니다. 철저한 IRepository 구현은 EF 부분, 데이터베이스 연결 등을 처리 할 것입니다. 데이터 액세스 계층에서 EF에 연결하는 것을 피할 수는 없습니다. 그러나 시작한 것과 같은 것을 사용하여 그 레이어에만 제약을 가할 수 있습니다. IRepository 오브젝트가 사용하는 데이터베이스 컨텍스트가 EF로 작업하는 유일한 오브젝트인지 확인하십시오.

다른 말로 표현하면 IDatabase 반환 엔터티가 없습니다. 연결 만 처리하면 IDatabase를 사용하는 도메인 개체 액세스를위한 다른 계층을 만들어야합니다. 내가 준 예제에서 IRepository 구현은 IDatabase의 인스턴스를 사용합니다.

+0

다른 엔터티와 함께 ​​작업 단위 (Unit Of Work)를 수행하려고 할 때 불행히도 이것은 효과가 없습니다. –