Может ли WCF Service иметь конструкторов? - PullRequest
41 голосов
/ 19 декабря 2008

Когда я создаю службу WCF в своем решении, могу ли я сделать следующее, есть конструктор с параметром для передачи? Если да, то как, когда и где среда выполнения заполняет мой требуемый объект IBusinessLogic?

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

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

Ответы [ 6 ]

13 голосов
/ 19 декабря 2008

Из коробки WCF будет использовать только конструктор по умолчанию, вы не можете использовать параметризованные конструкторы. Вы должны проделать небольшую дополнительную работу, чтобы создать параметризованные конструкторы вызова WCF.

Вы можете попробовать это:

Как передать значения конструктору в моей службе wcf?

6 голосов
/ 30 декабря 2008

Вы можете заставить WCF (как бы косвенно) вызывать конструкторы не по умолчанию, чтобы это работало, вам нужно свернуть свой собственный поставщик экземпляров. Вам нужно будет реализовать IInstanceProvider и добавить пользовательское поведение службы. Некоторые ссылки, которые покажут вам, как это сделать в сочетании с Spring.NET:

Внедрение зависимостей службы WCF

Пример кода Инъекция зависимости службы WCF

6 голосов
/ 19 декабря 2008

Посмотрите на ServiceHostFactory .

4 голосов
/ 30 декабря 2008

Другой случай, помимо других ответов, связан с созданием одноэлементного сервиса - это когда вы передаете экземпляр своего сервиса в ServiceHost (в отличие от типа);

Очевидно, что при создании экземпляра вы можете использовать любой конструктор;

Этот подход потребует добавления атрибута к вашей службе: [ServiceBehavior (InstanceContextMode.Single)];

3 голосов
/ 08 октября 2015

Я перефразировал решение @Mark Seemann как универсальное поведение поставщика экземпляров .

Как это использовать:

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

InstanceProviderКод поведения:

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
}
2 голосов
/ 07 сентября 2009

Вы должны реализовать IInstanceProvider, чтобы иметь возможность вызывать параметризованный конструктор службы. Этот конструктор не будет доступен в сгенерированном прокси.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...