asp.net-mvc - MVC 简单注入(inject)器和 RegisterPerWebRequest

标签 asp.net-mvc simple-injector

根据 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/

相关文章:

html - MVC Razor,按特定顺序显示显示数据

c# - displayformatattribute 自定义格式化字符串

c# - 依赖于实现相同接口(interface)的两个对象的简单注入(inject)器

Javascript 上传文件 MVC4 操作

asp.net-mvc - 为带有额外信息的图像设置虚拟路径

c# - 如何将 System.Net.Http.HttpResponseMessage 转换为 System.Web.Mvc.ActionResult

c# - 使用 Quartz.NET 和 Simple Injector 进行构造函数注入(inject)

c# - 使用 Simple Injector 将开放通用类型注册为回退

c# - Simple Injector - 将接口(interface)的特定实现注入(inject)到特定 Controller

c# - 简单的注入(inject)器插件