WCF服务可以有构造函数吗?

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

[ServiceContract] public interface IServiceContract { [OperationContract] ... } public class MyService : IServiceContract { IBusinessLogic _businessLogic; public ServiceLayer(IBusinessLogic businessLogic) { _businessLogic = businessLogic; } ... } 

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

你可以试试这个:

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

看看ServiceHostFactory 。

你可以得到WCF(间接)调用非默认的构造函数,为了这个工作,你需要滚动你自己的实例提供者。 您将需要实现IInstanceProvider并添加一个自定义的服务行为。 一些链接,将告诉你如何结合使用Spring.NET:

WCF服务dependency injection

代码示例WCF服务dependency injection

另一种情况,除了其他的响应之外,是在创build单例服务时 – 这是当你将服务的一个实例传递给ServiceHost(而不是types)的时候。

很明显,当你创build实例时,你可以使用任何构造函数;

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

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

我将@Mark Seemann的解决scheme解释为通用的实例提供者行为

如何使用它:

 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 }