我有一个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 回答
这样做怎么样? http://weblogs.asp.net/cibrax/archive/2007/12/13/wcf-dependency-injection-behavior.aspx
方法是关于实现Iinstanceprovider
http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iinstanceprovider.aspx
您可以依赖IKernel,它由Windsor自动提供 .
如果你真的,真的需要IWindsorContainer你可以在容器中注册,如果你愿意,可以自行注册:-)
然后你的ctor将成为:
通常不赞成对容器/内核的依赖,更好地注入你需要的组件,因为它会使你的依赖更清晰,你的代码可以测试 . 采用容器依赖就像使Global.SystemContainer'public static'并从应用程序的任何位置引用它 .
在您的示例中,ILogger(如果它是Castle.Core.ILogger)可以由LoggingFacility注入,无需自行解决 .