将Ninject与WebServiceHost一起使用的正确方法是什么?

时间:2013-10-01 18:14:35

标签: wcf ninject

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

请注意我没有.svc文件但不想要。所以我有无扩展名的网址。我正在使用Ninject向服务注入回购等。虽然它工作我不记得以前我是如何做到的,现在我的方式是错误的 - 它实际上像自托管一样工作 - 我需要服务参与IIS管道(使用相同的端口,使用AppPool启动/关闭)...

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

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为服务连接的最佳做法。

提前致谢。

1 个答案:

答案 0 :(得分: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;
    }