我已经采用这种方法在我的 ASP.NET MVC 应用程序中注入自定义资源提供程序,但是我在对象生命周期管理方面遇到了一些问题。
我正在使用 Castle Windsor,所以我有以下工厂实现:
public class DefaultResourceProviderFactory : ResourceProviderFactory
{
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
// IoC is a static helper class that gives me static access to the
// container. IoC.Resolve<T>(args...) simply calls container.Resolve<T>(args...).
return IoC.Resolve<IResourceProvider>(new { resourceType = "Global" });
}
public override IResourceProvider CreateLocalResourceProvider(string virtualPath)
{
// resourceType
return IoC.Resolve<IResourceProvider>(new { ResourceType = virtualPath });
}
}
但是,IResourceProvider
我在容器中注册的似乎没有正确管理其生命周期。它有自己的一些其他依赖项,其中一些有一些复杂的生活方式(每个 Web 请求或每个事务),所以我将其注册IResourceProvider
为瞬态以确保它的依赖项始终有效。但是 MVC 框架踩到了我的脚,保持对IResourceProvider
跨 Web 请求的引用,这会导致ObjectDisposedExceptions
它的依赖关系在下一个请求时失效。
我想做的是让 MVC 框架在每次需要 my 的实例时都使用工厂IResourceProvider
,并且 - 如果可能的话 - 也可以在完成时调用IoC.Release(provider)
或类似的东西。
如何IResourceProvider
以 MVC 框架尊重的方式对自定义的生活方式进行微观管理?