我们公司的一种产品由许多小型 Web 应用程序和一个 Windows 服务(也称为组件)组成,每个组件都可能驻留在不同的计算机中。其中之一是 WebForms 项目,它充当所有其他项目的配置中心。
我们现在正在设计一个功能来公开组件的一般信息。想象一个像这样的简单界面,例如:
public interface IStatistics
{
Statistics GetStatistics();
}
我们希望在所有组件上使用相同的接口,因此集中在一个通用的共享组件上。最初的实现也是相同的,所以它在同一个程序集中,在接口旁边。
然后的想法是在每个组件上公开一个 Wcf 服务,同时使用公共程序集上的实现和接口。该实现使用环境类返回不同的东西,具体取决于它们运行的位置,比如本地机器时间。
我想优雅地解决的问题是如何使用相同的接口将每个组件的所有实现传递给 webform。
我们目前使用Unity,但我想我会遇到任何其他 DI 解决方案同样的问题。我想注入这个相同接口的 5 个实现(每个组件一个),并且能够按组件区分它们(想想 a Dictionary<Component, IStatistics>
,哪里Component
是 a Enum
)。这是必要的,因为页面上会有一个下拉菜单来选择哪个组件的信息是可见的,然后页面会调用正确的实现来检索结果。
我知道我可以为所有实现使用命名注册,然后注入它们。不幸的是,这将导致我:
- 页面上有5个不同的参数,每个参数指向一个组件
- 使用不同的名称在容器上注册每个实现
- 在容器上显式注册我的网络表单,并使用自定义 InjectionConstructor 以正确的顺序为页面注入方法指定每个注册的接口
我知道 Unity 有一个 ResolveAll 方法,因此允许一个人接收IStatistics[]
or IEnumerable<IStatistics>
,但是我将无法区分它们。
我认为MEF用元数据接口的概念很好地解决了这个问题。也许在这方面进行 MEF 将是解决此问题的一种方法?我认为这里不合适,因为这些是我们正在谈论的 wcf 代理,我根本看不出这将如何与 MEF 集成。
也许使用工厂会是一个更好的策略,但是我看不到如何将服务也注入工厂,所以问题仍然存在。