我的温莎集装箱有一些非常奇怪的行为。
我已经像这样配置了我的容器。
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);
}
}
如果所有依赖项都以应有的方式解决和发布,是否有一些示例可用于测试?(生活方式测试)