通过DI的WCF构造函数服务类型
我目前正在尝试构建一个小型应用服务器,它将承载多个WCF服务。这些服务(当然还有它们的依赖项)应该由DI/IoC容器实例化(目前是LightCore,但由于我通过CommonServiceLocator使用它,所以应该很容易交换)。 不幸的是,我偶然发现了一个问题。显然,我必须创建ServiceHost实例来承载提到的WCF服务。我已经构建了一个定制的InstanceProvider和ServiceBehavior来处理服务的所有依赖关系,但是ServiceHost的构造函数需要服务到主机的服务类型。此时在我的程序中,我只知道接口类型,因为只有DI容器知道当前正在使用哪个服务实现 一种便宜的方法是通过服务定位器创建服务类型的“虚拟”实例,并向ServiceHost构造函数提供myDummyInstance.GetType()的输出,但这看起来很糟糕,无用的实例化和使用服务定位器而不是DI…必须有更好的方法通过DI的WCF构造函数服务类型,wcf,dependency-injection,servicehost,Wcf,Dependency Injection,Servicehost,我目前正在尝试构建一个小型应用服务器,它将承载多个WCF服务。这些服务(当然还有它们的依赖项)应该由DI/IoC容器实例化(目前是LightCore,但由于我通过CommonServiceLocator使用它,所以应该很容易交换)。 不幸的是,我偶然发现了一个问题。显然,我必须创建ServiceHost实例来承载提到的WCF服务。我已经构建了一个定制的InstanceProvider和ServiceBehavior来处理服务的所有依赖关系,但是ServiceHost的构造函数需要服务到主机的服务
有什么想法吗?:) 有多种方法可以做到这一点
- 我喜欢的方式很简单。您将不会解析服务的契约,而是解析服务实现本身,因为这正是WCF所期望的。我使用的所有IoC容器都能够解析类型本身并填充其依赖项
- 另一种方法是多一点黑客。当您调用服务主机的构造函数时,您将通过调用
来解析服务契约的类型。这很难看,但比创建虚拟实现要干净得多。此外,您永远不知道传递的类型是否未用于基础结构中的其他内容,因此传递伪类型可能是危险的ServiceLocator.resolve().GetType()