根据 Simple Injector 文档,我正在为 MVC 应用程序实例化我的存储库对象:
container.RegisterPerWebRequest<IUserRepository, SqlUserRepository>();
container.RegisterPerWebRequest<IOrderRepository, SqlOrderRepository>();
但我刚刚发现文档还指出:
与 Simple Injector 的默认行为相反,这些扩展方法确保释放创建的服务(当此类实例实现 IDisposable 时)。
https://simpleinjector.codeplex.com/wikipage?title=ObjectLifestyleManagement#PerWebRequest
问题:这是否意味着在使用 RegisterPerWebRequest 时,我的对象需要实现 IDisposable 以便它们在网络请求结束时被释放(即在代码下方)?
旁注:我相信使用 WebRequestLifestyle、RegisterInitializer、RegisterForDisposal 也需要实现 IDisposable 的对象。
示例代码(接口(interface)和实现)如下。
public interface IUserRepository : IDisposable
{
...
}
public class SqlUserRepository : IUserRepository, IDisposable
{
...
...
...
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
最佳答案
这里有一些旁注,您似乎在这里实现了完整的处理模式,但是当您制作 SqlUserRepository
sealed
时,您可以简化它。这允许您执行以下操作:
public sealed class SqlUserRepository : IUserRepository, IDisposable
{
public void Dispose()
{
_context.Dispose();
}
}
由于 SqlUserRepository
是密封的,没有人可以从中派生,因此:
- 不需要虚拟保护的 Dispose(bool) 方法。
- 不需要调用
SuppressFinalize
,因为只有在有 finalize 方法时才需要调用它,但由于您没有实现它并且您确定没有派生类型,所以您不需要不需要调用它。
也不需要 disposed
标志,因为您将 dispose 委托(delegate)给 _context
,但它应该能够多次调用 dispose;这是在 IDisposable
契约(Contract)中定义的。
此外,如果将该上下文对象注入(inject)到 SqlUserRepository
的构造函数中,则根本不需要在 SqlUserRepository
上实现 disposable。您只需使用 Web 请求生活方式注册该上下文,Simple Injector 就会为您处理它。
关于asp.net-mvc - MVC 简单注入(inject)器和 RegisterPerWebRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902834/