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

就是这样。