如果给出了提供者,为什么ServiceHost需要类类型?

时间:2016-07-22 09:00:24

标签: c# wcf dependency-injection

我有控制台主机应用程序。在这里我使用IoC容器作为实例的提供者,并希望将契约接口传递给ServiceHost构造函数。 显然,它说我不能用接口来做。

为什么ServiceHost甚至需要它?如果他想要实例化它我附加自定义提供程序!更重要的是,我不想将实例传递给它 - 它应该是按需要的。

如何仅从接口创建ServiceHost(请记住IoC中已有的所有必要绑定)?

示例:

var host = new ServiceHost(typeof(IMyContract), address);

因此,基本上,通过指定InstanceProvider,您应该获取此行为。但是微软强制要求具体的实现类型,即使我提供了实例工厂,也可能没有具体的实现类型!

2 个答案:

答案 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,它将知道如何解析传入实例的类型。