Ninject在WCF休息服务托管在Windows服务
我创建简单的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 - 它的工作原理
我做一些测试通过逐行添加行。
这看起来很简单的问题。
首先:当我们加载内核到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
就是这样。
我一直在寻找所有的解决方案都没有围绕IIS托管,我可以使用TopShelf使用Windows服务来托管,这解决了我的问题 - 希望我可以多劳多得 – JohnChris
我已经完成了与另一个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服务托管但我假设的地址不同)调用该服务。它应该在没有参数的构造函数下工作。
我一直在寻找一种解决方案,没有围绕托管在IIS中,我可以托管与TopShelf使用Windows服务,这解决了我的问题 - 希望我可以upvote不止一次 – JohnChris