首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >温莎短暂生活方式

温莎短暂生活方式
EN

Stack Overflow用户
提问于 2012-08-13 14:54:28
回答 1查看 531关注 0票数 1

我在温莎容器里有一些很奇怪的行为。

我把我的容器配置成这样。

代码语言:javascript
复制
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(一些分量)时,只要在适当的地方创建新的组件,一切都会像它应该的那样工作。

代码语言:javascript
复制
var contextProvider = MvcApplication.Container.Resolve<IDbContextProvider>();

替换成

代码语言:javascript
复制
var contextProvider = new DbContextProvider();

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

由于显式配置,这些任务是在瞬态配置的MVC3控制器中启动的。

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

我在文档中发现的另一件事是。你必须释放暂时的成分。我用IDisposable实现了所有组件。但是,由于在我的控制器中的自动结构注入,我不完全确定我是否必须手动释放他们,如果是的话,我如何能做到这一点。(是的,我知道我必须调用容器上的释放方法)

更新

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

代码语言:javascript
复制
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);
    }
}

如果所有依赖项都以其应有的方式被解析和释放,是否有可用于测试的示例?(LifeStyle测试)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 06:34:48

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

查看组件模型构造贡献者的文档,了解如何有效地改变容器的默认生活方式。

关于IDisposable的处理--如果您像释放控制器一样释放控制器,那么所有的东西都可以用于温莎:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11936862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档