wcf - 如何将值传递给 wcf 服务上的构造函数?

标签 wcf dependency-injection factory-pattern

我想将值传递到实现我的服务的类的构造函数中。

但是,ServiceHost 只允许我传递要创建的类型的名称,而不允许传递给其构造函数的参数。

我希望能够传入一个创建我的服务对象的工厂。

到目前为止我发现了什么:

最佳答案

您需要实现自定义 ServiceHostFactoryServiceHostIInstanceProvider 的组合。

给定具有此构造函数签名的服务:

public MyService(IDependency dep)

这是一个可以启动 MyService 的示例:

public class MyServiceHostFactory : ServiceHostFactory
{
    private readonly IDependency dep;

    public MyServiceHostFactory()
    {
        this.dep = new MyClass();
    }

    protected override ServiceHost CreateServiceHost(Type serviceType,
        Uri[] baseAddresses)
    {
        return new MyServiceHost(this.dep, serviceType, baseAddresses);
    }
}

public class MyServiceHost : ServiceHost
{
    public MyServiceHost(IDependency dep, Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
        if (dep == null)
        {
            throw new ArgumentNullException("dep");
        }

        foreach (var cd in this.ImplementedContracts.Values)
        {
            cd.Behaviors.Add(new MyInstanceProvider(dep));
        }
    }
}

public class MyInstanceProvider : IInstanceProvider, IContractBehavior
{
    private readonly IDependency dep;

    public MyInstanceProvider(IDependency dep)
    {
        if (dep == null)
        {
            throw new ArgumentNullException("dep");
        }

        this.dep = dep;
    }

    #region IInstanceProvider Members

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return this.GetInstance(instanceContext);
    }

    public object GetInstance(InstanceContext instanceContext)
    {
        return new MyService(this.dep);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
        var disposable = instance as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }

    #endregion

    #region IContractBehavior Members

    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
    }

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.InstanceProvider = this;
    }

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
    {
    }

    #endregion
}

在 MyService.svc 文件中注册 MyServiceHostFactory,或直接在代码中使用 MyServiceHost 以实现自托管方案。

您可以轻松地推广此方法,事实上,一些 DI 容器已经为您完成了此操作(提示:Windsor 的 WCF 工具)。

关于wcf - 如何将值传递给 wcf 服务上的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454850/

相关文章:

WCF 绑定(bind)到 HTTPS

C# 泛型和抽象工厂模式 - 或者做类似事情的某种方式

c++ - 在程序初始化时调用函数

python - 使用应用程序工厂进行 Flask 迁移时出错

c# - .net WCF GET HTTPS 400 错误请求,但与 Http 一起工作正常

wcf - Wif 保护 WCF 服务,缓存 token - 异步 wcf 方法丢失身份

c# - 依赖注入(inject)会导致额外的内存消耗吗?

.net - 将 .NET Core 登录到文件和控制台 - 带有时间戳

java - 具有循环依赖的 HK2 注入(inject)

.net - 与 Remoting 相比,为什么 WCF 性能如此缓慢?