IOC

2017-03-23 1 views
2
나는 하나 개의 서비스에서 다른 레디 스 인스턴스에 연결해야

에 연결 풀 레디 스 복수의 (다른)를 등록하는 방법 (서로 다른 스토리지 정책을 필요로하기 때문에 우리는 데이터베이스 당 하나 개의 레디 스 인스턴스가). 각 레디 스 DB에 대한 IOC

나는 생성자에서 해당 PooledRedisClientManager 인스턴스를 가지고 여러 가지 (다른) 저장소가 있습니다. 나는 그들이 모든 이 동일한 인터페이스 ( IRedisClientsManager)를 구현하기 때문에 제대로을 등록하는 방법을 이해하지 않습니다.

container.Register<IRedisClientsManager>(c => new PooledRedisClientManager(databaseAConnectionString)); 
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager(databaseBConnectionString)); 

위 등록은 연결 문자열에 의해서만 다르며이를 구분 (해결)하는 방법을 알지 못합니다. 내 서비스에서

//Pools for database A and B 
var databaseAPool = new PooledRedisClientManager(databaseAConnectionString) 
var databaseBPool = new PooledRedisClientManager(databaseBConnectionString) 
//Repositories for database A 
container.Register(c => new AClass1Repository(databaseAPool); 
container.Register(c => new AClass2Repository(databaseAPool); 
// etc 
//Repositories for database B 
container.Register(c => new BClass1Repository(databaseBPool); 
container.Register(c => new BClass2Repository(databaseBPool); 
// etc 

을 나는 같은 것을 할 좋아 : :이 같은 등록해야

//... 
var AClass1Repo = ServiceStackHost.Instance.Resolve<AClass1Repository>(); 
var BClass2Repo = ServiceStackHost.Instance.Resolve<BClass2Repository>(); 

var xyz = AClass1Repo.GetSomeData(....); 
BClass2Repo.StoreSomeData(somePocoInstance); 
//.... 

을 어떻게 각 데이터베이스에 대해 내 다른 레디 스 연결 풀 내 저장소를 철사해야합니까?

답변

2

만 1 IRedisClientsManager 그래서 당신이 늘 IOC에 2 개 PooledRedisClientManager 인스턴스를 등록 할 수 등록 할 수 있습니다. 당신은 다른 레디 스 매니저를 전달 다른 클래스를 등록 할 수 있습니다, 그러나 나는 또한 싱글 인스턴스들이 필요로 할 때, 예를 들어, 개별적으로 접근 할 수있어, 그래서 내 AppHost에 정의되어 줄 :

public class AppHost 
{ 
    PooledRedisClientManager RedisManagerA { get; set; } 
    PooledRedisClientManager RedisManagerB { get; set; } 

    public void Configure(Container container) 
    { 
     RedisManagerA = new PooledRedisClientManager(databaseAConnString); 
     RedisManagerB = new PooledRedisClientManager(databaseBConnString); 

     container.Register(c => new AClass1Repository(RedisManagerA); 
     container.Register(c => new AClass2Repository(RedisManagerA); 

     container.Register(c => new BClass1Repository(RedisManagerB); 
     container.Register(c => new BClass2Repository(RedisManagerB); 
    } 
} 

은 또한 액세스 할 필요가 없습니다 서비스 내부의 ServiceStackHost을 종속성으로 선언하면 삽입 될 수 있습니다. 예 :

public class MyService : Service 
{ 
    public AClass1Repository ARepo1 { get; set; } 
    public BClass1Repository BRepo1 { get; set; } 
} 
+0

감사합니다. RedisCachePool = 새로운 PooledRedisClientManager (cacheDbConnString) {; 세트를 얻을 수} PooledRedisClientManager RedisCache; 레디 스에 대한 또 하나의 문제는 ICacheClient'가'기반 container.Register (C => 새로운 내용은 여기 (RedisCachePool)) 'ServiceStackHost'에 대해 : 힌트를 주셔서 감사 드리며,'Service'에서 파생 된 모든 클래스에서 잘 작동합니다. 내 인증 공급자 구현에서는 작동하지 않습니다. – ThommyB

+0

당신이 당신의 캐시 클라이언트를위한 레디 스를 사용하려는 경우 당신은 당신이 캐시에 사용하려는 레디 스 풀 선택해야합니다, 예를 들어'container.Register (C => RedisManagerA.GetCacheClient()).'액세스 종속성을 선호하는 API가 당신이'IRequest.TryResolve ()'을 사용할 수 있다면. – mythz

+0

오, 죄송 합니다만,'GetCacheClient() 'PooledRedisClientManager'의 메소드입니다! – ThommyB