2017-02-12 58 views
-1

我有如何解决这种AspNetCore场景的正确方法?

Singleton<ICache, LocalClusterCache> 
Singleton<ICache, CloudCache> 
在同一个控制器

我希望同时使用,但DI不会允许我可以改用

Singleton<LocalClusterCache, LocalClusterCache> 
Singleton<CloudCache, CloudCache> 

,但我不认为它正确的方式

另一个问题:

我想Singleton<ICache, LocalCache>是InternalApiController中的不同实例和PublicAPIControlle中的不同实例里可以使用专用静态无功那些控制器内,它的工作,但它不是M $“DI”模式,即时通讯混淆的第一个问题

services.AddSingleton<ClassA>(); // same interface 
services.AddSingleton<ClassB>(); 
// then in controller 
SomeInterface classA = (ClassA)provider.GetService(typeof(ClassA)); 
SomeInterface classB = (ClassB)provider.GetService(typeof(ClassB)); 

,做工作

编辑解决方案(不知道如果它的百分之百正确的方式做M $方式)

回答

1

如果依赖关系是上下文的,创建一个抽象工厂并将其注册到注入容器是很常见的。通过这种方式,受抚养人有机会根据工厂所提供的内容进行挑选,而无需立即将其绑定到具体的类别。

+0

我编辑帖子添加一个可能的解决方案, 添加单独的工厂类添加了大量的开销(没人想要它) 但仍然不知道如何解决第二个问题,我的意思是同一类的DI单例,但单独每个控制器都可以很容易地通过静态私有属性来完成,但它不是DI然后 – gdpm

+0

@gdpm它可能只是一个非常小的类,它记录了缓存策略选择,我没有看到任何问题。但确定请求具体的类,容器将帮助它们的依赖关系(如果有的话),所以我仍然很看重这样做。 – Joppe