2016-03-03 68 views
0

我剛剛閱讀this很好的答案,如何將依賴關係注入到WCF服務中。解決方案非常整潔,但我有一個問題。在IIS中託管時將依賴關係注入到IErrorHandler中

解決方案在這個答案使用自託管(控制檯應用程序),所以它可以實現自己的ServiceHostErrorHandler做:

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託管服務時注入某些東西。任何幫助將是偉大的!

回答

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標記指定溫莎應該創建服務實例:

<%@ ServiceHost Language="C#" 
    Service="WcfService1.YourService" 
    CodeBehind="YourService.svc.cs" 
    Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration" 
    %> 

現在你可以有ILogger爲您服務的構造函數的參數。 Windsor將創建服務的每個實例併爲構造函數提供該參數。

我用它來創建每個WCF。


您的評論提到您使用Ninject。我發現this documentation顯示瞭如何連接Ninject和WCF。

它幾乎相同。對於服務的標記看起來是這樣的:

<%@ ServiceHost Language="C#" 
    Service="WcfService1.YourService" 
    CodeBehind="YourService.svc.cs" 
    Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" 
    %> 

然後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。這似乎有點侵入性。

+0

感謝您的建議。我會仔細看看它。雖然,我已經在使用Ninject IoC,但我不確定使用兩個不同的 –

+0

您不能使用兩個,因爲無論創建您的服務是創建一切。 (我想你可以,但這將是一個併發症,沒有任何好處。)我沒有使用Ninject,但我看了文檔,配置幾乎相同。我喜歡偶爾使用不同的代碼,以確保我不會編寫依賴於特定代碼的代碼。容器應該是「隱形的」。 –

相關問題