2010-10-13 37 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),不需要自己解决它。