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

通过DI的WCF构造函数服务类型,wcf,dependency-injection,servicehost,Wcf,Dependency Injection,Servicehost,我目前正在尝试构建一个小型应用服务器,它将承载多个WCF服务。这些服务(当然还有它们的依赖项)应该由DI/IoC容器实例化(目前是LightCore,但由于我通过CommonServiceLocator使用它,所以应该很容易交换)。 不幸的是,我偶然发现了一个问题。显然,我必须创建ServiceHost实例来承载提到的WCF服务。我已经构建了一个定制的InstanceProvider和ServiceBehavior来处理服务的所有依赖关系,但是ServiceHost的构造函数需要服务到主机的服务

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

一种便宜的方法是通过服务定位器创建服务类型的“虚拟”实例,并向ServiceHost构造函数提供myDummyInstance.GetType()的输出,但这看起来很糟糕,无用的实例化和使用服务定位器而不是DI…必须有更好的方法


有什么想法吗?:)

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

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

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