0

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

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

有什么想法吗?:)

4

1 回答 1

0

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

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