Asp.net mvc MVC简单注入器和寄存器WebRequest

Asp.net mvc MVC简单注入器和寄存器WebRequest,asp.net-mvc,simple-injector,Asp.net Mvc,Simple Injector,根据Simple Injector文档,我正在为MVC应用程序实例化存储库对象,如下所示: container.RegisterPerWebRequest<IUserRepository, SqlUserRepository>(); container.RegisterPerWebRequest<IOrderRepository, SqlOrderRepository>(); 披露:我没有使用SimpleInjector 从我读到的内容来看,不,您不需要实现IDispo

根据Simple Injector文档,我正在为MVC应用程序实例化存储库对象,如下所示:

container.RegisterPerWebRequest<IUserRepository, SqlUserRepository>();
container.RegisterPerWebRequest<IOrderRepository, SqlOrderRepository>();

披露:我没有使用SimpleInjector

从我读到的内容来看,不,您不需要实现
IDisposable

它的意思是,默认情况下,注册的对象不会被处理。也就是说,如果不是通过web请求注册对象,SimpleInjector不会尝试调用
Dispose()


但是,使用
registerWebRequest()
意味着如果对象是
IDisposable
的,则将调用
Dispose()
,除非您另行指定。

这里有一些旁注,似乎您在这里实现了完整的Dispose模式,但是,当您将
SqlUserRepository
密封后,您可以简化此过程。这允许您执行以下操作:

public sealed class SqlUserRepository : IUserRepository, IDisposable
{
    public void Dispose()
    {
        _context.Dispose();
    }
}
由于
SqlUserRepository
是密封的,因此没有人可以从中派生,因此存在:

  • 不需要虚拟受保护的Dispose(bool)方法
  • 不需要调用
    SuppressFinalize
    ,因为只有在存在finalize方法时才需要,但是由于您没有实现它,并且您确定没有派生类型,所以不需要调用它
也不需要有
disposed
标志,因为您正在将dispose委托给
\u上下文
,但它应该能够多次调用dispose;在
IDisposable
合同中定义


此外,如果将该上下文对象注入到
SqlUserRepository
的构造函数中,则根本不需要在
SqlUserRepository
上实现一次性。您只需向web请求生活方式注册该上下文,Simple Injector将为您处理该上下文。

抱歉,但我对您的声明“不,您不需要实现IDisposable”感到困惑。由于我正在处理一个MVC应用程序,每个web请求都是一个新的“会话”,因此我应该在我的存储库对象中实现IDispose(当使用RegisterPerWebRequest时),这样简单的注入器就可以处理和释放内存。对不起,我的语句是泛型的。我的意思是,一般来说,类不必实现
IDisposable
。是否实现
IDisposable
取决于您自己,取决于对象。如果某个对象确实实现了
IDisposable
,您可以放心,Simple Injector将在web请求结束时处理该对象。如果您询问是否需要实现您提供的代码,那么答案可能是否定的。如果您有需要清理的非托管资源或其他原因,并且希望调用
Dispose()
方法来最终确定对象,则只实现
IDisposable
。请注意,通常情况下,您的接口不应实现
IDisposable
;只有你的。否则,您正在泄漏实现详细信息,并且违反了。不知道此消息正在泄漏。我现在明白了。谢谢。是的,我已经实现了一个dispose模式。你的建议太棒了!谢谢正在更正我的dispose代码。
public sealed class SqlUserRepository : IUserRepository, IDisposable
{
    public void Dispose()
    {
        _context.Dispose();
    }
}