6

好的,我认为关于温莎城堡的信息可能太多了,因为寻找这些关键字给了我所有的例子,坦率地说,我对如何正确解决这个问题的理解不够。在这一点上,我已经尝试了很多排列,但运气不佳。

我有一个IUnitOfWorkFactory我想实例化为单例的。所以,我安装了 Castle Windsor,写了一些代码,如下所示:

iocContainer = new WindsorContainer()
    .Install(FromAssembly.This());

var propInjector = iocContainer.Register(
    Component.For<IUnitOfWorkFactory>()
    .LifestyleSingleton()
    .Instance(new NHUnitOfWorkFactory())
    );

propInjector.Resolve<IUnitOfWorkFactory>();

Application_Start这是从我的方法中调用的。

我有一个AccountController这样的接线:

public class AccountController : SecureController
{
    public IUnitOfWorkFactory UnitOfWorkFactory { get; set; }
    ...

...据我所知,这应该只是“工作”(尽管不要问我如何)。但是当我尝试使用它时,我的属性始终为空。

似乎我错过了一些愚蠢而简单的东西,但我不知道它是什么。

我也试过

var propInjector = iocContainer.Register(
    Component.For<IUnitOfWorkFactory>()
    .ImplementedBy<NHUnitOfWorkFactory>()
    .LifestyleSingleton()
    );

没有成功。

我究竟做错了什么?

结论

我在这里错过了几个步骤。我按照教程构建了一个安装程序和一个引导程序,但是我在错误的位置注册了我的服务......在构建控制器工厂之前。现在我的引导程序看起来像这样:

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 个问题...

4

1 回答 1

7

当容器解析根对象时,构造函数和属性注入都起作用。在这种情况下,您AccountController将是 Windsor 需要创建的根对象。

为了将其连接起来,您应该使用控制器工厂。一旦控制器注册并由容器解析,一切都应该按照您的预期工作。

于 2013-03-15T23:35:18.717 回答