首页 文章

使用Castle Windsor进行WCF依赖注入 - 请帮忙?

提问于
浏览
2

我有一个WCF服务,它调用调用存储库的业务组件,并且我使用它的WCF工具使用Castle Windsor进行端到端工作 .

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();
        }
    }

不过我希望这个容器可以在全局使用,并且不想一遍又一遍地运行注册,所以我应该考虑在HttpRuntime.Cache中调整这个容器,这样它就可用了,任何组件都可以简单地从Cache获取并解决他们想要的界面 .

请原谅我的无知,因为我是WCF的新手,以及Castle Windsor和整个建筑已经被扼杀在我的喉咙陡峭的截止日期:-(

2 回答

  • 0

    您可以依赖IKernel,它由Windsor自动提供 .

    public BookingBll(IKernel kernel, IBookingRepository repository) {}
    

    如果你真的,真的需要IWindsorContainer你可以在容器中注册,如果你愿意,可以自行注册:-)

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

    然后你的ctor将成为:

    public BookingBll(IWindsorContainer container, IBookingRepository repository) {}
    

    通常不赞成对容器/内核的依赖,更好地注入你需要的组件,因为它会使你的依赖更清晰,你的代码可以测试 . 采用容器依赖就像使Global.SystemContainer'public static'并从应用程序的任何位置引用它 .

    在您的示例中,ILogger(如果它是Castle.Core.ILogger)可以由LoggingFacility注入,无需自行解决 .

相关问题