1

이것은 매우 이상한 아키텍처입니다. 나와 함께 견뎌주세요.여러 데이터베이스를 쿼리하는 저장소 패턴

Google은 기존의 계층 형 애플리케이션 (데이터, 로직/서비스, 클라이언트)을 보유하고 있습니다. 최근 요구 사항은 서비스 계층이 두 가지 데이터 소스에 액세스해야한다는 것입니다. !!!! (다른 방법은 없습니다) 이 두 데이터 소스에는 동일한 DB 스키마가 있습니다. 대부분의 계층 구조와 마찬가지로

, 우리는 읽고 같은 방법을 쓰기 권한 :

IEnumerable<Product> GetAllProducts(), 
Product GetProductById(ProductKey id), 
IEnumerable<Product> FindProductsByName(string name) 

을 제품 DTO들은 다음과 같습니다

:

class Product 
{ 
    public ProductKey Key { get; set;} 
    ... 
} 

class ProductKey 
{ 
    public long ID { get; } 
} 

우리는 두 가지 솔루션을 좁혀 대안 1 : 서비스가 다음과 같이 사용할 DB를 알 수 있도록 매개 변수를 읽기 메소드에 추가하십시오. Product GetProdu ctById (ProductKey id, DataSource dataSource) DataSource은 열거 형입니다.

대체 2 (내 솔루션) : 키 클래스에 DataSource 속성을 추가하십시오. 이 개체는 개체를 검색 할 때 Entity Framework에서 설정합니다. 또한 db에 유지되지 않습니다.

class ProductKey 
{ 
    public long ID { get; } 
    public DataSource Source { get; } //enum 
} 

이점은 변경 사항이 클라이언트에 미치는 영향이 최소화된다는 것입니다.

그러나, 사람들은 DataSource은 비즈니스 가치를 추가하지 않습니다

  • 때문에이 솔루션처럼 해달라고. (내 반응은 ID 중 하나 비즈니스 가치를 추가하지 않습니다. 그 대용 키. 그 목적은 지속성 추적을위한)도 중복 DataSource를 포함 할 객체 그래프에서
  • 아이들을

어느 솔루션이 더 좋은 소리입니까? 다른 대안이 있습니까?

참고 : 이러한 서비스는 모든 곳에서 사용됩니다. (내가 전화 한 것입니다 그 이상 또는)

[||||||||||||||] 
[|||||||||s! ] 
[||||nerics! ] 
[ Generics! ] 

가 나는 "동적 저장소를"사용

+0

데이터베이스 스키마는 동일하지만 이동해야 할 데이터 소스에 대한 단서를 제공하는 DTO 자체에 대해서는 어떤 것이 있습니까? 키 또는 데이터 소스는 어느 시점에서 클라이언트의 관점에서 설정됩니까? – Josh

+0

클라이언트는 검색 할 데이터 소스 (예 : GetAllNewProducts ([데이터 소스]))를 선택합니다. 그런 다음 반환 된 제품을 다른보기에서 볼 수 있고 (데이터 소스 A에서 가져온 경우 편집 가능) 수 있습니다. 이 뷰는 제품과 관련된 항목을 가져 오기 위해 추가 쿼리를 수행합니다 (예 : GetRelatedProducts (ProductKey)). – LostInComputer

+0

개체를 쿼리에서 만들 때 DataSource를 자동으로 설정하도록 ObjectContext (또는 DbContext)를 확장했습니다. – LostInComputer

답변

4

은 내가 제안하는 것은 문 번호 3입니다. 동일한 사용 블록 (예 : 다시 인스턴스화하지 않음)에있는 동안 모든 datacontext 또는 dbset에 연결할 수 있도록 설정됩니다.

  using (var dr = new DynamicRepo()) 
      { 
       dr.Add<House>(model.House); 
       foreach (var rs in model.Rooms) 
       { 
        rs.HouseId = model.House.HouseId; 
        dr.Add<Room>(rs); 
       } 
      } 

이것은 그 정의 dbcontext "기본"을 사용하여 여기에

내가 그것을 사용하는 방법의 조각입니다. 각각은 저장소에 정의되어야하지만 인스턴스화되지 않아야합니다. 다음은 내가 사용하는 생성자입니다 :

public DynamicRepo(bool Main = true, bool Archive = false) 
    { 
     if (Main) 
     { 
      this.context = new MainDbContext(); 
     } 
     if (Archive) 
     { 
      this.context = new ArchiveDbContext(); 
     } 
    } 

이것은 두 개의 컨텍스트 만있는 단순화 된 버전입니다.심도있는 선택 방법을 구현하여 사용할 컨텍스트를 선택할 수 있습니다.

그리고 한 번 초기화, 여기에 추가 작동 방법이 될 것입니다 :

public void Add<T>(T te) where T : class 
    { 
     DbSet<T> dbSet = context.Set<T>(); 
     dbSet.Add(te); 
     context.SaveChanges(); 
    } 

이의 좋은 장점은 데이터베이스와 상호 작용에 대한 코드를 유지하기 위해 단 하나의 자리가 있다는 것입니다. 다른 모든 논리는 다른 클래스로 추상화 될 수 있습니다. 이 방식으로 제네릭 저장소를 사용하는 데 많은 시간을 절약 할 수있었습니다.

내가 뭘 찾고 있는지 오해하지 않았 으면 좋겠지 만 여러 데이터 소스에 대해 하나의 리포지토리를 보유하려는 경우 좋은 방법이라고 생각합니다.

+0

문제는 DbContext가 아닙니다. 우리는 단지 다른 연결 문자열을 사용합니다. 현재 저장소는 "Product GetProductById (ProductKey key)"를 허용합니다. 저장소가 어떤 DB에 접근 할지를 알 수 있도록 어떻게 수정할 수 있습니까? – LostInComputer

+0

@LostInComputer - 'GetProductById' 서명을 수정하지 않고 있습니까? –

+0

그 질문에 내가 쓴 대안 1입니다. 위 참조. – LostInComputer

관련 문제