3

将 Ninject 与 WebServiceHost 一起使用的正确方法是什么(在 IIS 中托管时)

请注意,我没有 .svc 文件并且不想要一个。所以我有无扩展名的网址。我正在使用 Ninject 将 repo 等注入服务。虽然它有效,但我不记得我以前是怎么做的,我现在做的方式是错误的 - 它实际上像自托管一样工作 - 我需要服务参与 IIS 管道(使用相同的端口,启动/关闭与应用程序池)...

我添加了对 Ninject.Extensions.WCF 的引用,它在我的 App_Start 文件夹中创建了 NinectWebCommon.cs。在其中,我按如下方式连接服务(但我不想指定 url/端口,我希望它参与正确的生命周期)

private static void RegisterServices(IKernel kernel)
{
    var port = 8080;
    var uri = new Uri(String.Format("http://{0}:{1}/api", Environment.MachineName, port));

    var baseAddr = new Uri[] { uri };
    var binding = new WebHttpBinding(WebHttpSecurityMode.None);
    var endPoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(MyServiceClassHere))
        , binding, new EndpointAddress(uri));

    kernel.Bind<IProjectRepository>().To<MyRepo>();

    kernel.Bind<WebServiceHost>().To<NinjectWebServiceHost>()
        .WithConstructorArgument("serviceType", typeof(MyServiceClassHere))
        .WithConstructorArgument("baseAddresses", baseAddr);

    var webBehavior = new WebHttpBehavior() { HelpEnabled = true };
    endPoint.Behaviors.Add(webBehavior);

    _host = kernel.Get<WebServiceHost>();
    _host.AddServiceEndpoint(endPoint);
    _host.Open();
}  

您能否帮助我了解使用 Ninject 连接服务的最佳实践。

提前致谢。

4

1 回答 1

0

这篇博文帮助我在 IIS 中托管的 WCF 服务中启动并运行 Ninject: http ://www.aaronstannard.com/post/2011/08/16/dependency-injection-ninject-wcf-service.aspx

我不得不重写 NinjectModule 上的 Load 方法:

public class WCFNinjectModule : NinjectModule
{
    public override void Load()
    {
       Bind<IProjectRepository>().To<MyRepo>();
    }
}

然后在 global.asax 中,我不得不重写 CreateKernel() 方法。

    protected override IKernel CreateKernel()
    {
            StandardKernel kernel = new StandardKernel(new WCFNinjectModule());
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            return kernel;
    }
于 2013-11-16T08:53:18.493 回答