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

WCFでデフォルト以外のコンストラクターを(間接的に)呼び出すことができます。これを機能させるには、独自のインスタンスプロバイダーをロールする必要があります。IInstanceProviderを実装し、カスタムサービス動作を追加する必要があります。Spring.NETと組み合わせてこれを行う方法を示すいくつかのリンク:

WCFサービスの依存性注入

コード例WCFサービス依存性注入

于 2008-12-30T12:32:42.790 に答える
6

ServiceHostFactoryを見てください。

于 2008-12-19T18:45:10.317 に答える
4

他の応答に加えて、別のケースは、シングルトンサービスを作成する場合です。これは、サービスのインスタンスを(タイプではなく)ServiceHostに渡す場合です。

明らかに、インスタンスを作成するときに、どのコンストラクターも使用できます。

This approach will require adding an attribute to your service: [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 に答える