2017-06-29 118 views
1

我創建簡單的WCF休息服務:Ninject在WCF休息服務託管在Windows服務

[ServiceContract] 
public interface IReadData 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "GetHealthStatus")] 
    string GetHealthStatus(); 
} 

和:

public class ReadData : IReadData 
{ 
    private IFacadeToRepo repository; 

    public ReadData(IFacadeToRepo connectorToRepo) 
    { 
     this.repository = connectorToRepo; 
    } 

    public string GetHealthStatus() 
    { 
     return "ok"; 
    } 
} 

接下來,我創建了 「映射」:

class NinjectBindings: NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IReadData>().To<ReadData>(); 
     Bind<IFacadeToRepo>().To<RepositoryApi>(); 
    } 
} 

而且最後我創建了ServiceBase:

public partial class MyRestWCFRestWinSer : ServiceBase 
{ 
    ServiceHost readDataServiceHost = null; 
    private StandardKernel kernel; 

    public MyRestWCFRestWinSer() 
    { 
     kernel = new StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 

     InitializeComponent(); 
    } 

    public void OnDebug() 
    { 
     OnStart(null); 
    } 

    protected override void OnStart(string[] args) 
    { 
     readDataServiceHost = new ServiceHost(kernel.Get<IReadData>()); 
     readDataServiceHost.Open(); 
    } 

    protected override void OnStop() 
    { 
     if (readDataServiceHost != null) 
     { 
      readDataServiceHost.Close(); 
      readDataServiceHost = null; 
     } 
    } 
} 

所以我認爲現在ninject應該解析IReadData並創建新的ReadData witch默認IFacadeToRepo。但它不起作用。通過installutil安裝windows服務並運行processes - >我收到「服務正在啓動,服務無法啓動,服務沒有報告錯誤。」

你能幫我將這些web服務與ninjects一起運行嗎?

編輯。它看起來像它具有獨特的有問題的:

kernel.Get<IReadData>() 

後更換到:

的typeof(READDATA)

並添加默認情況下,空的構造函數READDATA - 它的工作原理

我做一些測試通過逐行添加行。

+0

我一直在尋找一種解決方案,沒有圍繞託管在IIS中,我可以託管與TopShelf使用Windows服務,這解決了我的問題 - 希望我可以upvote不止一次 – JohnChris

回答

1

這看起來很簡單的問題。

首先:當我們加載內核到ninject,它應該開始這是由

public override void Load(). 

覆蓋方法負載,但它不工作。 解決方案?關於這一類的可用性問題:

class NinjectBindings: NinjectModule 

我把它改爲:

public class NinjectBindings: NinjectModule 

在結果是工作。

第二件事:我需要通過增加ServiceBehaviour改變業務行爲:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] 
public class ReadData : IReadData 

就是這樣。

+0

我一直在尋找所有的解決方案都沒有圍繞IIS託管,我可以使用TopShelf使用Windows服務來託管,這解決了我的問題 - 希望我可以多勞多得 – JohnChris

0

我已經完成了與另一個DI容器「城堡溫莎」和WCF休息服務。訣竅是將ServiceRoute添加到應用程序啓動事件的RoutTable中,如下所示。

RouteTable.Routes.Add(new ServiceRoute("servicename", new WindsorServiceHostFactory<RestServiceModel>(), typeof(IReadData))); 

1-在Ninject中尋找類似WindsorServiceHostFactory的類。

2-通過http://xx.com/servicename/GetHealthStatus(在IIS下託管,同樣必須適用於Windows服務託管但我假設的地址不同)調用該服務。它應該在沒有參數的構造函數下工作。