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

时间:2011-07-08 22:05:36

标签: wcf dependency-injection servicehost

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

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

任何想法? :)

1 个答案:

答案 0 :(得分:0)

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

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