![](/img/trans.png)
[英]IIS hosting for WCF service with 2 contracts or hosting 2 services with dependencies
[英]Injecting dependencies into an IErrorHandler while hosting in IIS
我刚刚读了这个很棒的答案,如何将依赖项注入WCF服务。 解决方案很简洁,但是我有一个问题。
此答案中的解决方案使用自我托管(控制台应用程序),因此可以实现自己的ServiceHost
和ErrorHandler
并执行以下操作:
var logger = new DummyLogger();
var errorHandler = new TestErrorHandler(logger);
ServiceHost host = new TestServiceHost(errorHandler, typeof(TestService), new Uri("net.tcp://localhost:8002"));
host.Open();
我的问题是, 如何在ASP.NET Web应用程序主机中执行此操作 ? 我试图通过IIS托管时向Service中注入一些东西。 任何帮助将是巨大的!
温莎城堡的WCF集成工具可以做到这一点。
将nuget包添加到WCF项目。 在您的应用程序启动中(您创建的global.asax或一些引导类):
using System;
using Castle.Facilities.WcfIntegration;
using Castle.Windsor;
using Castle.Windsor.Installer;
namespace WcfService1
{
public class Global : System.Web.HttpApplication
{
static readonly IWindsorContainer Container = new WindsorContainer();
protected void Application_Start(object sender, EventArgs e)
{
ConfigureContainer();
}
private void ConfigureContainer()
{
Container.AddFacility<WcfFacility>();
Container.Install(FromAssembly.This());
}
}
}
然后添加一个安装程序类。 Container.Install(FromAssembly.This())
将执行您服务中的所有安装程序。
using Castle.Core.Logging;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
namespace WcfService1
{
public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<IYourService,YourService>(),
Component.For<ILogger,DummyLogger>()
);
}
}
}
最后,编辑YourService.svc的标记以指定Windsor应该创建服务实例:
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration"
%>
现在,您可以在服务的构造函数中将ILogger作为参数。 温莎将创建服务的每个实例,并将为构造函数提供该参数。
我几乎将其用于创建的每个WCF。
您的评论提到您使用了Ninject。 我找到了该文档 , 该文档显示了如何使用WCF连接Ninject。
这几乎是相同的。 服务的标记如下所示:
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
%>
然后是相当于Windsor安装程序的Ninject:
public class WCFNinjectModule : NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<DummyLogger>();
}
}
然后在global.asax
public class Global : NinjectWcfApplication
protected override IKernel CreateKernel()
{
return new StandardKernel(new WCFNinjectModule());
}
看起来唯一的一件事情就是您必须继承NinjectWcfApplication
。 在global.asax
。 这似乎有点干扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.