我正在和Prism一起玩耍和阅读。我知道建议的方法是在基础架构程序集中定义一些所有模块都可以引用的通用“服务”。不同的模块可以实现这些接口,并基本上注册以提供这些服务。其他模块可以“消费”这些服务。
我想知道如果两个不同的模块实现接口并且基本上提供相同的服务会发生什么。在调用服务接口时,消费者将获得哪种服务。
假设我有一个INewsFeed,BlogScraper模块实现了这个服务以及PrintMagazineScanner模块。如果我有另一个使用此服务的模块,可以说通过显示新闻源,它将获得哪些服务?
答案 0 :(得分:4)
这取决于您使用的IoC容器。通常,如果您尝试使用相同的接口两次注册服务,它将立即抛出异常或允许您覆盖以前的注册,或者当您尝试请求单个实例时它会抛出异常不止一个注册。
例如,如果你使用MEF,你可以使用相同的合同(接口)导出多个服务,但是当你导入这些服务时,你必须定义一个带有ImportMany
属性的集合属性:
[ImportMany]
public IEnumerable<IMyService> MyServices { get; set; }
答案 1 :(得分:0)
这与棱镜无关。它更可能是您的IoC容器行为的问题。
答案 2 :(得分:0)
是的,这是IoC问题。如果使用ServiceLocator接口,则通常(包括Unity)调用GetInstance将返回为该服务接口注册的最后一个类型。 GetAllInstances将返回所有已注册实现的列表。