将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为服务连接的最佳做法。
提前致谢。
答案 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;
}