2012-04-03 1 views
2

セルフホストのSystem.ServiceModel.Web.WebServiceHost(.NET 4)を作成しようとしていますが、コンストラクタの問題が発生しています。パラメータのないコンストラクタなしで、サービスタイプのインスタンスを介してWebServiceHostをインスタンス化することは可能ですか?

  1. WebServiceHost()無意味と思われるパラメータのないコンストラクタ、サービスの種類、あるいは契約を指定する方法はありませんよう:3つのオプションがあります。それを反映して、何もしません。ベースを呼び出さない空のデフォルトのコンストラクタです。

  2. WebServiceHost(object singletonInstance, params Uri[] baseAddresses)これはInstanceContextMode.PerCallクラスであるため、シングルトンインスタンスは必要ありません。

  3. WebServiceHost(System.Type serviceType, params Uri[] baseAddresses)サービスとしてインスタンス化したいタイプには、パラメータのないコンストラクタ(このメソッドの要件)はありません。私はNInjectを使用してコンストラクタにパラメータをプッシュしています。しかし、私はこれを自己テストとして実行しようとしているので、私はDIを避けたいと思います。

これらの行にはオプションがありますか、または自己ホストしないでください。

答えて

3

パラメータなしのコンストラクタなしでサービスクラスをサポートするには、サービスクラスの作成方法を知っているIInstanceProviderの実装を使用する必要があります。下のコードはWebServiceHostのコードを示しています。http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspxにインスタンスプロバイダーの詳細があります。

public class StackOverflow_9997163 
{ 
    [ServiceContract] 
    public class Service 
    { 
     private int increment; 
     public Service(int increment) 
     { 
      this.increment = increment; 
     } 
     [WebGet] 
     public int Add(int x, int y) 
     { 
      return x + y + increment; 
     } 
    } 
    class MyInstanceProvider : IInstanceProvider 
    { 
     Func<Service> serviceCreator; 
     public MyInstanceProvider(Func<Service> serviceCreator) 
     { 
      this.serviceCreator = serviceCreator; 
     } 

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

     public object GetInstance(InstanceContext instanceContext) 
     { 
      return this.serviceCreator(); 
     } 

     public void ReleaseInstance(InstanceContext instanceContext, object instance) 
     { 
     } 
    } 
    class MyServiceBehavior : IServiceBehavior 
    { 
     Func<Service> serviceCreator; 
     public MyServiceBehavior(Func<Service> serviceCreator) 
     { 
      this.serviceCreator = serviceCreator; 
     } 

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

     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
      { 
       foreach (EndpointDispatcher ed in cd.Endpoints) 
       { 
        ed.DispatchRuntime.InstanceProvider = new MyInstanceProvider(this.serviceCreator); 
       } 
      } 
     } 

     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     int currentIncrement = 1; 
     host.Description.Behaviors.Add(new MyServiceBehavior(delegate() 
     { 
      return new Service(currentIncrement++); 
     })); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     for (int i = 0; i < 10; i++) 
     { 
      WebClient c = new WebClient(); 
      Console.WriteLine(c.DownloadString(baseAddress + "/Add?x=6&y=8")); 
     } 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

ありがとうございます。うまくいきました。 – nicodemus13

関連する問題