我有控制台主机应用程序。在这里我使用IoC容器作为实例的提供者,并希望将契约接口传递给ServiceHost构造函数。 显然,它说我不能用接口来做。
为什么ServiceHost甚至需要它?如果他想要实例化它我附加自定义提供程序!更重要的是,我不想将实例传递给它 - 它应该是按需要的。
如何仅从接口创建ServiceHost(请记住IoC中已有的所有必要绑定)?
示例:
var host = new ServiceHost(typeof(IMyContract), address);
因此,基本上,通过指定InstanceProvider,您应该获取此行为。但是微软强制要求具体的实现类型,即使我提供了实例工厂,也可能没有具体的实现类型!
答案 0 :(得分:0)
ServiceHost
的构造函数接受服务的类类型或现有实例,其中serviceType
必须是具有无参数构造函数的类:
public ServiceHost(Type serviceType, params Uri[] baseAddresses);
public ServiceHost(object singletonInstance, params Uri[] baseAddresses);
要使用后一个构造函数,您的服务实现必须使用InstanceContextMode.Single
标记为ServiceBehavior
:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service : IService
{
// ...
}
现在您可以使用您喜欢的任何注射容器来创建服务,您的服务甚至可以使用带参数的构造函数。
public class DiscoveryService
{
private readonly IService _service;
private ServiceHost _serviceHost;
public DiscoveryService(IService service)
{
_service = service;
// ...
}
private void StartServerMode()
{
_serviceHost = new ServiceHost(_service);
_serviceHost.Open();
// ...
}
}
答案 1 :(得分:0)
简单的原因是内部ServiceHost
有一个方法CreateImplmentation
,它将调用传入类型的默认构造函数。
当您传递接口作为类型时,没有要调用的构造函数。它不会自动搜索您的程序中的接口危险程序,您的代码(或您使用的DI库)负责查找这些实现并为其传递Type
值。
可以进行搜索的一种方法是实现a custom IInstanceProvider
,它将知道如何解析传入实例的类型。