我在温莎容器里有一些很奇怪的行为。
我把我的容器配置成这样。
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(一些分量)时,只要在适当的地方创建新的组件,一切都会像它应该的那样工作。
var contextProvider = MvcApplication.Container.Resolve<IDbContextProvider>();替换成
var contextProvider = new DbContextProvider();所以我的问题是我在这里错过了什么。
由于显式配置,这些任务是在瞬态配置的MVC3控制器中启动的。
由于上面的代码,DbContextProvider在所有配置为瞬态的存储库中都得到了解析。
我在文档中发现的另一件事是。你必须释放暂时的成分。我用IDisposable实现了所有组件。但是,由于在我的控制器中的自动结构注入,我不完全确定我是否必须手动释放他们,如果是的话,我如何能做到这一点。(是的,我知道我必须调用容器上的释放方法)
更新
下面的代码负责释放和解析我的控制器:
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测试)
发布于 2012-08-14 06:34:48
我不确定这是否是导致您的问题的原因,但是您应该只在ComponentModel的实现中修改IContributeComponentModelConstruction。
查看组件模型构造贡献者的文档,了解如何有效地改变容器的默认生活方式。
关于IDisposable的处理--如果您像释放控制器一样释放控制器,那么所有的东西都可以用于温莎:)
https://stackoverflow.com/questions/11936862
复制相似问题