【问题标题】:CA2000 and Dependency InjectionCA2000 和依赖注入
【发布时间】:2012-12-21 15:46:56
【问题描述】:

我正在使用一种相当简单的 DI 模式将我的数据存储库注入到我的控制器类中,并且我在每个控制器类上都收到了 CA2000 代码分析警告(在失去范围之前处理对象)。我知道为什么会发生警告,并且通常可以弄清楚如何解决它,但在这种情况下我无法弄清楚

  1. 如何在对象创建和方法返回之间引发异常,或者
  2. 我可以在哪里放置 try/finally 块以消除错误。

在我放弃并抑制所有地方的警告消息之前,有没有更好的方法来实现不会导致潜在未处置对象的相同效果?

public class AccountController : Controller
{
    public AccountController () 
        : this(new SqlDataRepository()) 
    {
    }

    public AccountController ( IDataRepository db )
    {
        this.db = db ?? new SqlDataRepository();

        // Lots of other initialization code here that I'd really like
        // to avoid duplicating in the other constructor.
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (this.db != null))
        {
            IDisposable temp = this.db as IDisposable;
            if (temp != null)
            {
                temp.Dispose();
            }
        }
    }
 }

【问题讨论】:

  • 无论如何,Dispose 方法中的(this.db != null) 是多余的,因为您在几行之后再次对其进行空检查。您也可以在Dispose 方法的底部调用base.Dispose(disposing) 以确保ControllerDispose 也正确清理。

标签: c# asp.net-mvc-3 code-analysis


【解决方案1】:

如果您使用的是 ASP.Net MVC,您可以让您的控制器实现 IDisposable,并且管道会为您处理它。见ASP MVC: When is IController Dispose() called?

【讨论】:

  • Controller 已经实现了IDisposable 所以我认为这已经发生了;无论如何,明确地重新实现IDisposable 没有任何效果。
  • 静态分析可能无法判断处置是否生效,但您应该放心忽略该错误,因为它正在处置中。
  • @SteveCzetty - 安全地忽略警告不是问题。如果我安全地忽略每个警告,我的输出屏幕将有几十页长。我们通过 StyleCop 和 FxCop 来消除所有这些噪音,这样当确实有问题时,它就会显示出来,并且在我们编译时很容易阅读。
【解决方案2】:

您的存储库实现 IDisposable。让您的控制器也实现 IDisposable,并在 dispose 方法中清理您的存储库。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2012-02-15
    • 2011-05-11
    • 2011-04-04
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多