通过 DI 的 WCF 构造函数服务类型

Posted

技术标签:

【中文标题】通过 DI 的 WCF 构造函数服务类型【英文标题】:WCF constructor Service Type via DI 【发布时间】:2011-10-01 15:26:13 【问题描述】:

我目前正在尝试构建一个小型应用服务器,它可以托管多个 WCF 服务。这些服务(当然还有它们的依赖项)应该由 DI/IoC 容器(目前是 LightCore,但由于我通过 CommonServiceLocator 使用它应该很容易交换)来实例化。 不幸的是,我偶然发现了一个问题。显然,我必须创建 ServiceHost 实例来托管提到的 WCF 服务。我已经构建了一个自定义的 InstanceProvider 和 ServiceBehavior 来处理服务的所有依赖项,但是 ServiceHost 的构造函数需要服务的服务类型来托管。此时在我的程序中,我只知道接口类型,因为只有 DI 容器知道当前正在使用哪个服务实现。

一种廉价的方法是通过 Service Locator 创建服务类型的“虚拟”实例,并将 myDummyInstance.GetType() 的输出提供给 ServiceHost 构造函数,但这只会让人觉得痛苦,无用的实例化和使用 Service定位器而不是 DI...必须有更好的方法。

有什么想法吗? :)

【问题讨论】:

【参考方案1】:

有多种方法可以做到这一点。

我喜欢的方式很简单。您不会解决服务合同,而是解决服务实现本身,因为这正是 WCF 所期望的。我使用的所有 IoC 容器都能够自行解析类型并填充其依赖项。 另一种方法是更多的hack。当您调用服务主机的构造函数时,您将通过调用ServiceLocator.Resolve<IContract>().GetType() 来解析服务合同的类型。它很丑陋,但比创建虚拟实现要干净得多。此外,您永远不知道传递的类型是否未用于基础架构中的其他内容,因此传递虚拟类型可能很危险。

【讨论】:

嗨。不幸的是,CommonServiceLocator 似乎不允许/支持您的第一种方式(或者我误解了它),但这将是一个完美的解决方案。第二种方式对我的虚拟实例没有太大的影响。我没有放置实例引用,没错,但它使用 ServiceLocator(可能是不可避免的)并且还创建了一个虚拟实例,只是没有引用它:)。

以上是关于通过 DI 的 WCF 构造函数服务类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ninject 2 将参数传递给 WCF ServiceHost 类型

类型化数据集 + WCF。服务正在接收空数据表

Ninject 3、WCF服务和参数化构造函数

WCF 服务可以有构造函数吗?

是否可以在 WCF 中没有无参数构造函数的情况下序列化对象?

WCF 服务 - 使用 json 调用客户端访问 rest 未提供正确的内容类型