2017-06-29 116 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服务托管但我假设的地址不同)调用该服务。它应该在没有参数的构造函数下工作。