【问题标题】:Ninject in WCF rest service hosted on Windows service托管在 Windows 服务上的 WCF REST 服务中的 Ninject
【发布时间】:2017-06-29 09:05:12
【问题描述】:

我创建了简单的 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";
    }
}

接下来我创建了“映射器”:

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 服务并运行过程后 -> 我收到“服务正在启动。服务无法启动。服务未报告错误。”

您能帮我与 ninjects 一起运行这些 Web 服务吗?

编辑。看起来它有问题:

kernel.Get<IReadData>()

将其替换为:

typeof(ReadData)

并将默认的空构造函数添加到 ReadData - 它可以工作

我通过逐行添加进行了一些测试。

【问题讨论】:

  • 我一直在寻找一个不围绕在 IIS 中托管的解决方案,我可以在其中使用带有 TopShelf 的 Windows 服务进行托管,这解决了我的问题 - 希望我能多次投票

标签: wcf ninject self-hosting


【解决方案1】:

这似乎是一个很简单的问题。

首先:当我们将内核加载到ninject中时,它应该启动被

覆盖的方法Load
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 服务进行托管,这解决了我的问题 - 希望我能多次投票
【解决方案2】:

我已经通过另一个 DI 容器“Castle Windsor”和 WCF 休息服务做到了这一点。诀窍是在应用程序启动事件中向 RoutTable 添加 ServiceRoute,如下所示。

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

1- 在 Ninject 中寻找类似于 WindsorServiceHostFactory 的类。

2- 通过http://xx.com/servicename/GetHealthStatus 调用服务(对于在 IIS 下托管,同样必须适用于 Windows 服务托管,但我假设的地址不同)。它应该在没有无参数构造函数的情况下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多