2014-11-08 3 views
1

새로운 MVC 프로젝트를 설정하고 구조 맵을 사용하여 DI/IoC를 처리하고 있습니다. 저장소 클래스 및 EF 데이터 컨텍스트를 사용하여 Entity Framework 및 캐싱 저장소를 사용하고 있습니다. CacheRepositoryEFRepository -조건부 구조 맵을 사용하여 DataContext 선택

그래서, 콘크리트에 의해 구현되는 IRepository이 (간체). EFRepositoryDataContext에 (DbContext)에 의존하고 IService CacheRepository는 (영구 저장소 대체로) IRepository에 의존하고 이 ICachingService (그래서 내 캐시 공급 업체를 선택할 수 있습니다), 다음 서비스으로 구현되며 저장소의 수에 따라 다릅니다.

내 문제는 내 로그인 데이터베이스가 사이트의 어떤 영역에 로그인했는지에 따라 다릅니다 (예 : 관리자가 별도의 로그인 데이터베이스를 가지고 있음 - 여기서는 다루지 않습니다). 나는 내 모든 사용자 테이블을 포함하는 기본 datacontext를 가지고 있으며 두 개의 주요 datacontexts에서 상속받습니다. 그래서 사용자가 로그인을 시도하는 사이트의 영역에 따라 세부 정보를 확인할 데이터베이스가 결정됩니다. 따라서 컨트롤러에 따라 datacontext 또는 connectionstring을 선택할 수 있어야합니다.

누군가가 나에게 datacontext/connectionstring 컨트롤러를 기반으로이 조건부 선택을 달성하는 방법에 관해서 몇 가지 지침을 제공 할 수 있습니까?

내 IOC의 레지스트리는 현재 다음과 같이합니다 (datacontexts 중 하나 참조) 같습니다

아키텍처의 큰 그림을 보지 않고 대답을하지만, SomeService가 나타냅니다 당신은 아마 (이런 식으로 뭔가를 할 수 어려운
 For<BaseDataContext>().LifecycleIs<HttpContextLifecycle>() 
     .Use(x => new AdminDataContext()); 

     //REPOSITORIES 
     For<IDAL.Repositories.Users.IApplicationUserRepository>() 
      .Use<DAL.Repositories.Users.EFApplicationUserRepository>(); 

     For<IDAL.Repositories.Users.IUserLoginAttemptRepository>() 
      .Use<DAL.Repositories.Users.EFUserLoginAttemptRepository>(); 

     For<IDAL.Repositories.Users.IUserRoleRepository>() 
      .Use<DAL.Repositories.Users.CacheRoleRepository>() 
      .Ctor<IDAL.Repositories.Users.IUserRoleRepository>() 
      .Is<DAL.Repositories.Users.EFUserRoleRepository>() 
      .Ctor<IDAL.Caching.IGenericCachingService<Common.Objects.Data.Users.UserRole>>() 
      .Is<DAL.Caching.HttpContextGenericCachingService<Common.Objects.Data.Users.UserRole>>(); 

     //SERVICES 
     For<IBLL.Services.IUserService>() 
      .Use<BLL.Services.UserService>(); 
+0

행운이 있나요? –

+0

@ Javid_p84, 지금까지 아니오 - 어떤 아이디어? 건배. – Carl

+0

아닙니다. 그것을 극복하기 위해 몇 가지 더미 인터페이스를 추가했습니다. 흥미로운 점은 지금까지는 해결책이 없다는 것입니다 (아니면 최소한 우리가 알지 못하는 것). –

답변

0

비즈니스 로직 계층) :

여기에는 아무 것도 없습니다 - 단지 표준 생성자 주입입니다. 컨트롤러와 Entity Framework 사이에 비즈니스 로직 계층을 가지는 것이 좋은 방법이며 컨트롤러가 Entity Framework에 대해 알 필요없이 올바른 DbContext를 주입 할 수있는 곳을 제공합니다.

+0

IoC 컨테이너를 사용하여 DbContext, Irepository 및 Iservice가있는 DI 패턴이 이미 있습니다. 내 저장소로 전달되는 datacontext가 시스템의 어떤 영역에서 인스턴스화되었는지에 따라 동일한 서비스 및 저장소에서 다를 수 있습니다. IoC 컨테이너는 어떻게 결정할 수 있습니까? 즉 컨트롤러/네임 스페이스 등을 IoC 레지스트리에서 datacontext 인스턴스를 선택하는 요소로 만드는 방법은 무엇입니까? – Carl

+0

아마도 컨트롤러/네임 스페이스에서 지시하는 잘못된 트리를 사용하고있을 것입니다. 필자가 시연 한 패턴은 잘 동작 할 것입니다 - 컨스트럭터 (컨텍스트 1 컨텍스트 1, 컨텍스트 2 컨텍스트 2 등)에 여러 컨텍스트를 추가하십시오. 이제 다른 컨텍스트를 사용할 수있는 일반 저장소를 사용하는 경우 Repo를 리팩토링하여 일반 유형 IRepository (C : DbContext)을 가져와야합니다. 그런 다음 ISomeService 대신 ISomeService 이 이미 여기에 설명 된 내용을 추가합니다. –