2010-10-13 47 views
2

我有一個WCF服務,它調用調用存儲庫的業務組件,並且使用它的WCF工具使用Castle Windsor進行端到端的工作。使用溫莎城堡的WCF依賴注入 - 請幫忙?

WCF Facility註冊和組件註冊的其餘部分發生在這樣的Global.asax文件中。

 

    public class Global : System.Web.HttpApplication 
    { 
     public IWindsorContainer SystemContainer; 

     protected void Application_Start(object sender, EventArgs e) 
     { 
      RegisterDependencies(); 
     } 

     private void RegisterDependencies() 
     { 
      SystemContainer = new WindsorContainer(); 


      SystemContainer.AddFacility<WcfFacility>().Register(
       Component.For<IBookingRepository>().ImplementedBy<BookingRepository>(), 
       Component.For<IBookingBll>().ImplementedBy<BookingBll>(), 
       Component.For<IBookingService>().ImplementedBy<BookingService>(), 
       Component.For<ILogger>().ImplementedBy<Logger>() 

       ); 
     } 

    }

一切都很好,但現在我需要參考在我的組件之一這個容器,這樣我可以解決其他組件這樣。

public class BookingBll : IBookingBll { private IBookingRepository _repository; private ILogger _logger; public BookingBll(IBookingRepository repository) { _repository = repository; _logger = SystemContainer.Resolve<ILogger>(); // This will not //compile as we can't access a Global class property. } public void Add(Booking booking) { //Some implementation; _logger.Write(); } }

Moreoever我想這個容器可以全局和不想一遍又一遍運行註冊,所以我應該看看在HttpRuntime.Cache shuving這個容器,以便它可以和任何組件都可以把它簡單從緩存中解析並解決他們想要的任何接口。

請原諒我的無知,我是新來的WCF和以及溫莎城堡,整個架構已經shuved我的喉嚨有陡峭的截止日期:-(

+0

你最終在這裏做了什麼?我處於同樣的情況。 – 2011-03-15 10:21:33

回答

0
+0

感謝您的回覆,但IInstanceProvider,IServiceBehavior和服務主機工廠的擴展已由WCF Facility關注。事實上,我已經提到,在我的.svc文件中,將如何使用此線創建服務工廠<%@ ServiceHost Language =「C#」Service =「BookingService」Factory =「Castle.Facilities.WcfIntegration.DefaultServiceHostFactory,Castle.Facilities .WcfIntegration「%>和端到端它的工作是它的容器是在global.asax.cs文件中,並且我如何將代碼中的容器返回。 – 2010-10-13 04:51:03

0

你可以有一個的iKernel依賴,它會自動提供b溫莎。

public BookingBll(IKernel kernel, IBookingRepository repository) {} 

如果你真的需要IWindsorContainer如果你想:-)

SystemContainer.Register(Component.For<IWindsorContainer>.Instance(SystemContainer)); 

那麼你的構造函數將成爲你可以把它在容器中,自注冊登記:

public BookingBll(IWindsorContainer container, IBookingRepository repository) {} 

對容器/內核進行依賴時,通常不贊成使用它,更好地注入所需的組件,因爲它會使您的依賴關係更清晰並且可以測試代碼。獲取容器依賴關係就像使Global.SystemContainer'public static'一樣,並從您的應用程序中的任何地方引用它。

在你的例子中,LoggingFacility可以注入ILogger(如果它是Castle.Core.ILogger),不需要自己解決它。