2012-12-21 113 views
5

我正在使用一个相当简单的DI模式将我的数据存储库注入到我的控制器类中,并且我在每一个控制器类中都得到了CA2000代码分析警告(在丢失范围之前处理对象)。我知道为什么警告正在发生的事情,而且通常可以找出如何解决它,但在这种情况下,我无法弄清楚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(); 
      } 
     } 
    } 
} 
+1

在任何情况下,Dispose'方法中的'(this.db!= null)'都是多余的,因为您在几行之后再次执行空检查。你也可以在你的'Dispose'方法的底部调用'base.Dispose(disposing)'来确保'Controller'的'Dispose'正确清理。 –

回答

1

如果您使用的是ASP.Net MVC,您可以让您的控制器执行IDisposable,并且管道将负责为您处置它。见ASP MVC: When is IController Dispose() called?

+0

'控制器'已经实现'IDisposable',所以我认为已经发生了;无论如何,显式重新实现'IDisposable'没有任何效果。 –

+1

静态分析可能无法说明处置正在生效,但您应该安全忽略错误,因为它正在处理中。 –

0

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