好吧我觉得关于Castle Windsor的信息可能太多了,因为寻找这些关键字给了我一切的例子,坦率地说,我对它如何正确解决这个问题的理解不够.在这一点上,我尝试了很少的运气.
我有一个IUnitOfWorkFactory,我想将其实例化为单例.所以,我安装了Castle Windsor,写了一些像这样的代码:
iocContainer = new WindsorContainer() .Install(FromAssembly.This()); var propInjector = iocContainer.Register( Component.For<IUnitOfWorkFactory>() .LifestyleSingleton() .Instance(new NHUnitOfWorkFactory()) ); propInjector.Resolve<IUnitOfWorkFactory>();
我有一个AccountController连线如下:
public class AccountController : SecureController { public IUnitOfWorkFactory UnitOfWorkFactory { get; set; } ...
……据我所知,这应该只是“工作”(虽然不要问我怎么做).但是当我尝试使用它时,我的属性总是为null.
好像我错过了一些愚蠢而简单的东西,但我不知道它是什么.
我也试过了
var propInjector = iocContainer.Register( Component.For<IUnitOfWorkFactory>() .ImplementedBy<NHUnitOfWorkFactory>() .LifestyleSingleton() );
没有成功.
我究竟做错了什么?
结论
我在这里错过了几个步骤.我已经为tutorial构建了一个安装程序和一个引导程序,但是在构建控制器工厂之前,我在错误的位置注册了我的服务.现在我的引导程序看起来像这样:
iocContainer = new WindsorContainer() .Install(FromAssembly.This()); var controllerFactory = new WindsorControllerFactory(iocContainer.Kernel); ControllerBuilder.Current.SetControllerFactory(controllerFactory); iocContainer.Register( Component.For<IUnitOfWorkFactory>() .ImplementedBy<NHUnitOfWorkFactory>() .LifestyleSingleton() );
……我的房产注射不再是空的……现在我只需要调试其他87个问题……
解决方法
当容器解析根对象时,构造函数和属性注入都起作用.在这种情况下,yourAccountController将是Windsor需要创建的根对象.
为了进行连接,您应该使用controller factory.一旦控制器被容器注册并解析,一切都应该按预期工作.