0

我刚刚阅读了这个很好的答案,如何将依赖项注入 WCF 服务。解决方案非常简洁,但我有一个问题。

此答案中的解决方案使用自托管(控制台应用程序),因此可以实现自己的ServiceHostand ErrorHandlerand do:

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 托管时向服务中注入一些东西。任何帮助都会很棒!

4

1 回答 1

1

Castle Windsor 的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 作为服务构造函数中的参数。Windsor 将创建服务的每个实例,并为构造函数提供该参数。

我几乎将它用于我创建的每个 WCF。


您的评论提到您使用 Ninject。我找到了这个文档,它展示了如何将 Ninject 与 WCF 连接起来。

它几乎完全相同。服务的标记如下所示:

<%@ 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. 这似乎有点侵入性。

于 2016-03-06T06:09:46.237 回答