3

希望這是一件容易的事。我想知道這是否可能 - 可能不是。我試圖自主託管一個WCF服務(在我的例子中,它是一個控制檯應用程序)。該服務沒有默認的構造函數。它只包含一個參數簽名構造函數。我需要該服務來處理用戶會話。目前我正在使用Ninject DI。這裏是我想出了證明我的問題一個簡單的代碼解決方案:自主主機(無IIS或WAS)帶有需要參數的服務的WCF

using System; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using Ninject.Modules; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     static void Main() 
     { 
      using (var webServiceHost = new WebServiceHost(typeof(MyWcf))) 
      { 
       var webHttpBinding = new WebHttpBinding(); 
       var uri = new Uri("http://localhost:8000/"); 
       webServiceHost.AddServiceEndpoint(typeof(IMyWcf), webHttpBinding, uri); 
       webServiceHost.Open(); 
       Console.WriteLine("Service is ready..."); 
       Console.ReadKey(); 
      } 
     } 
    } 

    [ServiceContract] 
    public interface IMyWcf 
    { 
     [OperationContract, WebGet(UriTemplate = "")] 
     string HelloWorld(); 
    } 

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class MyWcf : IMyWcf 
    { 
     private readonly IMessage _customMessage = new Message("Default Message."); 

     public MyWcf(IMessage message) 
     { 
      _customMessage = message; 
     } 

     public string HelloWorld() 
     { 
      return _customMessage.Text; 
     } 
    } 

    public interface IMessage 
    { 
     string Text { get; } 
    } 

    public class Message : IMessage 
    { 
     public Message (string message) 
     { 
      Text = message; 
     } 
     public string Text { get; set; } 
    } 

    public class NinjectSetup : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IMessage>().To<Message>() 
       .WithConstructorArgument("message", "Injected String Message."); 
     } 
    } 
} 

顯然註釋掉參數的構造函數允許服務運行。但是那樣做對我沒有好處。我不想使用ServiceHostFactory,因爲這顯然需要我有一個.svc/IIS。有沒有解決的辦法?我可以創建一個新的MyWebServiceHost繼承自WebServiceHost並覆蓋一些將爲服務創建實例的方法嗎?

+2

你看過Ninject.Extensions.wcf中的例子嗎?很確定自己的主機例子是這樣做的。 – 2012-04-04 19:35:47

+0

你有沒有注意到你可以鏈接?我發現的每個例子都有它在IIS中使用ServiceHostFactory或ServiceBehavior ... – ymerej 2012-04-04 19:39:57

+0

Prety確定在示例目錄中有兩個。一個被稱爲self host或sometthing(所有obv在Ninject.Extensions.Wcf存儲庫中的github上) – 2012-04-04 19:41:22

回答

1

使用上面Ruben的建議(在評論中),我能夠在Ninject.Extensions.Wcf源代碼庫中找到一個工作示例。