0

私はちょうどこの素晴らしい答えを読んだところです。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 に何かを挿入しようとしています。どんな助けでも素晴らしいでしょう!

4

1 に答える 1

1

Castle Windsor のWCF Integration Facilityがこれを行います。

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 に答える