2017-07-26 9 views
1

私はWCFサービスにいくつかのビジネスサービスを注入しようとしています。私は本当にポストinteresstingこれを読んで:How do I pass values to the constructor on my wcf service?WCFサービスに依存関係を注入する方法

そして、私は次のことを行っている:

カスタムのServiceHost

public class UnityServiceHost : ServiceHost 
    { 
     public UnityServiceHost(IUnityContainer container, Type serviceType, params Uri[] baseAddresses) 
      : base(serviceType, baseAddresses) 
     { 
      if (container == null) 
      { 
       throw new ArgumentNullException(nameof(container)); 
      } 

      foreach (ContractDescription contractDescription in ImplementedContracts.Values) 
      { 
       contractDescription.Behaviors.Add(new UnityInstanceProvider(serviceType, container)); 
      } 
     } 
    } 

カスタムインスタンスプロバイダ

public class UnityInstanceProvider : IInstanceProvider, IContractBehavior 
{ 
    private readonly Type m_serviceType; 
    private readonly IUnityContainer m_container; 

    public UnityInstanceProvider(Type serviceType, IUnityContainer container) 
    { 
     m_serviceType = serviceType; 
     m_container = container; 
    } 
    public object GetInstance(InstanceContext instanceContext, Message message) 
    { 
     return GetInstance(instanceContext); 
    } 
    public object GetInstance(InstanceContext instanceContext) 
    { 
     return m_container.Resolve(m_serviceType); 
    } 
    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 
     (instance as IDisposable)?.Dispose(); 
    } 
    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)  {  } 
} 

サービスの振る舞いこと私はこのように見ている:

[ServiceBehavior] 
public class MyService : IMyService 
{ 
    public ServerInformationService(ISomeDependency coreManager) 
    { 
     //... 
    } 
} 

しかし、私はGetInstanceに得ることはありません、と私は、コードを実行したとき、私はこれを取得:

それ にはないので、提供されるサービスの種類をサービスとしてロードすることができませんでしたデフォルトの(パラメータのない)コンストラクタを持つ 問題を修正するには、型にデフォルトのコンストラクタを追加するか、 のインスタンスをホストに渡します。

どうしたのですか?私のインスタンスプロバイダが使用されていないように見える

+0

これは、注入しようとしている依存関係にパラメータのないコンストラクタがあることを示しています。 – ArunGeorge

+0

@A runGeorge私はそうではないと思います。イベントは 'return m_container.Resolve(m_serviceType);'ブレークポイントで停止しません。私はWPF以外の依存関係を持つ同じ正確なサービスを要求することができます。 – J4N

+0

サービスはIISでホストされていますか?あなたは 'UnityServiceHost'クラスを使っていますか? –

答えて

0

私は最終的に解決策を見つけました。私はInstanceProviderをサービスにではなく連絡先に適用していました。私はサービス(new UnityServiceHost(...) ....、その場合のセルフホスティングしていますので、それが動作します

public class UnityInstanceProvider : IInstanceProvider, IServiceBehavior 
{ 
    private readonly Type m_serviceType; 
    private readonly IUnityContainer m_container; 

    public UnityInstanceProvider(Type serviceType, IUnityContainer container) 
    { 
     m_serviceType = serviceType; 
     m_container = container; 
    } 

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers) 
     { 
      ChannelDispatcher cd = (ChannelDispatcher)channelDispatcherBase; 
      foreach (EndpointDispatcher ed in cd.Endpoints) 
      { 
       if (!ed.IsSystemEndpoint) 
       { 
        ed.DispatchRuntime.InstanceProvider = this; 
       } 
      } 
     } 
    } 

    public object GetInstance(InstanceContext instanceContext) 
    { 
     return m_container.Resolve(m_serviceType); 
    } 

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

    public void ReleaseInstance(InstanceContext instanceContext, object instance) 
    { 
     (instance as IDisposable)?.Dispose(); 
    } 
} 

public class UnityServiceHost : ServiceHost 
{ 
    public UnityServiceHost(IUnityContainer container, Type serviceType, params Uri[] baseAddresses) 
     : base(serviceType, baseAddresses) 
    { 
     if (container == null) 
     { 
      throw new ArgumentNullException(nameof(container)); 
     } 
     Description.Behaviors.Add(new UnityInstanceProvider(serviceType, container)); 
    } 
} 

と行動+インスタンスプロバイダ:ここ

は私の最後の(ワーキング)ソリューションですIIS上にあったため、そのような振る舞いを作成できませんでした

関連する問題