2014-10-22 83 views
2

使用Redis時,我們創建一個ConnectionMultiplexer並從那個GetDatabase()獲得對給定緩存的訪問權限。使用統一註冊實例注入依賴關係

我想配置統一要做到這一點,如下所示:

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); 
container.RegisterInstance(redis); 
container.RegisterType<IDatabase, redis.GetDatabase()>(); 

但是這並不奇怪這不會編譯。

我可以在那一刻想到的唯一另一種方法是創建一個數據庫工廠類和傳遞到我控制器代替了IDatabase的,但似乎有點小題大做,我也只是基本被包裹的包裝:

public static void RegisterComponents() { 
    ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost"); 
    container.RegisterInstance(redis); 
    RedisDatabaseFactory redisDbf = new RedisDatabaseFactory(redis); 
    container.RegisterInstance(redisDbf); 
    container.RegisterType<IRedisDatabaseFactory, RedisDatabaseFactory>(); 
} 

MyController.cs

public MyController(IRedisDatabaseFactory rdbf){ 
    _db = rdbf.GetDatabase(); 
} 

所以短期使用這種過於冗長的工廠方法,我該如何使用註冊實例的方法來創建用於注射催產素依賴性她的對象?

回答

4

您可以使用InjectionFactoryIDatabase註冊一個工廠方法:

container.RegisterType<IDatabase>(new InjectionFactory(c => redis.GetDatabase())); 
+0

完美,我知道必須有一個簡寫。 – rism 2014-10-22 10:41:47

+0

不用擔心。如果你想從已註冊的'ConnectionMultiplexer'獲得數據庫,那麼你可以從容器參數('c'在上面的代碼中)解決它 – 2014-10-22 10:44:30

+1

你的意思是這樣的:container.RegisterType (new InjectionFactory(c => c .Resolve ()GetDatabase()))。這不是一回事嗎?或者在這個和你的答案之間有一個不同的範圍? – rism 2014-10-22 10:50:46