1

我的温莎集装箱有一些非常奇怪的行为。

我已经像这样配置了我的容器。

Container = new WindsorContainer();
Container.Kernel.ComponentModelCreated += KernelComponentModelCreated;
Container.Install(FromAssembly.This());

private static void KernelComponentModelCreated(ComponentModel model)
{
    if (model.LifestyleType == LifestyleType.Undefined)
        model.LifestyleType = LifestyleType.Transient;
}

因此,我假设我所有未指定生活方式的组件都会获得短暂的生活方式,并且直到现在它似乎都没有出现任何问题。

我启动了多个异步任务,它们都解决了一些组件。(所以你会期望每个任务都会获得一个新的组件实例)

但是现在我知道任务没有获得新实例,因为我的任务由于组件的跨线程问题而失败。(所以它被用于多个任务)

当我更换 Container.Resolve(somecomponent); 只需在适当的位置创建新组件,一切就可以正常工作。

var contextProvider = MvcApplication.Container.Resolve<IDbContextProvider>();

替换为

var contextProvider = new DbContextProvider();

所以我的问题是我在这里错过了什么。

由于显式配置,任务在临时配置的 MVC3 控制器中启动。

由于上面的代码,所有存储库中都解析了 DbContextProvider,也配置了瞬态。

我在文档中发现的另一件事是。您必须释放瞬态组件。我用 IDisposable 实现了所有组件。但是由于控制器中的自动构造器注入,我不完全确定是否必须手动释放它们,如果是,我该怎么做。(是的,我知道我必须调用容器上的 Release 方法)

更新

下面的代码负责释放和解决我的控制器:

public class WindsorControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorControllerFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path));
        }
        return (IController)_kernel.Resolve(controllerType);
    }
}

如果所有依赖项都以应有的方式解决和发布,是否有一些示例可用于测试?(生活方式测试)

4

1 回答 1

1

我不确定这是否是导致您的问题的原因,但您应该只ComponentModel在实现中进行修改IContributeComponentModelConstruction

查看组件模型构建贡献者的文档以获取有关如何有效更改容器默认生活方式的帮助。

关于IDisposables 的处置-如果您像应该一样释放控制器,那么一切都将与 Windsor 一起工作:)

于 2012-08-14T06:34:48.300 回答