Ninject 在 Windows 服务上托管的 WCF 休息服务中
Ninject in WCF rest service hosted on Windows service
我创建了简单的 WCF Rest 服务:
[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";
}
}
接下来我创建了 "mapper":
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 默认 IFacadeToRepo。但它不起作用。通过 installutil 和 运行 过程安装 windows 服务后 -> 我收到 "The service is starting. The service could not be started. The service did not report an error."
你能帮我 运行 这些网络服务和 ninject 吗?
编辑。看起来它有问题:
kernel.Get<IReadData>()
替换为:
typeof(读取数据)
并向 ReadData 添加默认的空构造函数 - 它有效
我通过逐行添加进行了一些测试。
我已经用另一个 DI 容器 "Castle Windsor" 和 WCF rest 服务做到了这一点。诀窍是在应用程序启动事件中将 ServiceRoute 添加到 RoutTable,如下所示。
RouteTable.Routes.Add(new ServiceRoute("servicename", new WindsorServiceHostFactory<RestServiceModel>(), typeof(IReadData)));
1- 在 Ninject.
中寻找类似于 WindsorServiceHostFactory 的 class
2- 通过 http://xx.com/servicename/GetHealthStatus 调用服务(对于在 IIS 下托管,同样必须适用于 windows 服务托管,但我假设地址不同)。它应该在没有无参数构造函数的情况下工作。
看起来很简单的问题。
首先:当我们将内核加载到 ninject 时,它应该启动被
覆盖的方法 Load
public override void Load().
但是没有用。
解决方案?有关此 class 可用性的问题:
class NinjectBindings: NinjectModule
我改成了:
public class NinjectBindings: NinjectModule
结果是工作。
第二件事:我需要通过添加 ServiceBehaviour 来更改服务行为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class ReadData : IReadData
就是这样。
我创建了简单的 WCF Rest 服务:
[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";
}
}
接下来我创建了 "mapper":
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 默认 IFacadeToRepo。但它不起作用。通过 installutil 和 运行 过程安装 windows 服务后 -> 我收到 "The service is starting. The service could not be started. The service did not report an error."
你能帮我 运行 这些网络服务和 ninject 吗?
编辑。看起来它有问题:
kernel.Get<IReadData>()
替换为:
typeof(读取数据)
并向 ReadData 添加默认的空构造函数 - 它有效
我通过逐行添加进行了一些测试。
我已经用另一个 DI 容器 "Castle Windsor" 和 WCF rest 服务做到了这一点。诀窍是在应用程序启动事件中将 ServiceRoute 添加到 RoutTable,如下所示。
RouteTable.Routes.Add(new ServiceRoute("servicename", new WindsorServiceHostFactory<RestServiceModel>(), typeof(IReadData)));
1- 在 Ninject.
中寻找类似于 WindsorServiceHostFactory 的 class2- 通过 http://xx.com/servicename/GetHealthStatus 调用服务(对于在 IIS 下托管,同样必须适用于 windows 服务托管,但我假设地址不同)。它应该在没有无参数构造函数的情况下工作。
看起来很简单的问题。
首先:当我们将内核加载到 ninject 时,它应该启动被
覆盖的方法 Loadpublic override void Load().
但是没有用。 解决方案?有关此 class 可用性的问题:
class NinjectBindings: NinjectModule
我改成了:
public class NinjectBindings: NinjectModule
结果是工作。
第二件事:我需要通过添加 ServiceBehaviour 来更改服务行为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class ReadData : IReadData
就是这样。