42

当我在我的解决方案中新建一个 WCF 服务时,我可以执行以下操作,有一个带参数的构造函数要传入吗?如果是,运行时如何、何时以及在何处填充我所需的 IBusinessLogic 对象?

[ServiceContract]
public interface IServiceContract
{
    [OperationContract]
    ...
}

public class MyService : IServiceContract
{
    IBusinessLogic _businessLogic;
    public ServiceLayer(IBusinessLogic businessLogic)
    {
        _businessLogic = businessLogic;
    }
    ...
}
4

6 回答 6

13

开箱即用的 WCF 将仅使用默认构造函数,您不能使用参数化构造函数。您必须做一些额外的工作才能使 WCF 调用参数化构造函数。

你可以试试这个:

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

于 2008-12-19T19:14:07.963 回答
6

看看ServiceHostFactory

于 2008-12-19T18:45:10.317 回答
6

您可以让 WCF(某种程度上间接地)调用非默认构造函数,为此您需要滚动自己的实例提供程序。您需要实现 IInstanceProvider 并添加自定义服务行为。一些链接将向您展示如何结合 Spring.NET 执行此操作:

WCF 服务依赖注入

代码示例 WCF 服务依赖注入

于 2008-12-30T12:32:42.790 回答
4

除了其他响应之外,另一种情况是创建单例服务时 - 这是您将服务实例传递给 ServiceHost(而不是类型)时;

显然,当您创建实例时,您可以使用任何构造函数;

这种方法需要向您的服务添加一个属性:[ServiceBehavior(InstanceContextMode.Single)];

于 2008-12-30T13:03:01.823 回答
4

我将@Mark Seemann 的解决方案解释为通用实例提供程序行为

如何使用它:

var host = new ServiceHost(typeof(MyService), baseAddress);
var instanceProvider = new InstanceProviderBehavior<T>(() => new MyService(businessLogic));
instanceProvider.AddToAllContracts(host);

InstanceProviderBehavior 代码:

public class InstanceProviderBehavior<T> : IInstanceProvider, IContractBehavior
    where T : class
{
  private readonly Func<T> m_instanceProvider;

  public InstanceProviderBehavior(Func<T> instanceProvider)
  {
    m_instanceProvider = instanceProvider;
  }

  // I think this method is more suitable to be an extension method of ServiceHost.
  // I put it here in order to simplify the code.
  public void AddToAllContracts(ServiceHost serviceHost)
  {
    foreach (var endpoint in serviceHost.Description.Endpoints)
    {
      endpoint.Contract.Behaviors.Add(this);
    }
  }

  #region IInstanceProvider Members

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

  public object GetInstance(InstanceContext instanceContext)
  {
    // Create a new instance of T
    return m_instanceProvider.Invoke();
  }

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

  #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
}
于 2015-10-08T11:37:21.533 回答
2

您必须实现 IInstanceProvider 才能调用参数化服务构造函数。此构造函数在生成的代理中将不可用。

于 2009-09-07T06:39:00.450 回答