2017-01-06 93 views
0

在web api控制器中,我用於在using keyword範圍內創建實例,所以一旦它從使用中出來,GC將被調用並且內存將被釋放。哪裏應該在web api控制器中創建實例

我現在使用它的代碼,

public class TemplateController : AutoVHCBaseApiController 
    { 

     [Route("{id}")] 
     [HttpGet] 
     [ResponseType(typeof(VHC.Core.Common.Beans.CheckTemplate))] 
     public IHttpActionResult Get(int id) 
     { 
      try 
      { 
       using(ITemplateManager manager=new TemplateManager()) 
       { 
        CheckTemplate checkTemplate = manager.GetCheckTemplate(id, SiteCode); 
        return Ok(checkTemplate); 
       } 
      } 
      catch (ValidationException ex) 
      { 
       return BadRequest(ex.Message, FailureReason.ReasonCodeOptions.ValidationError); 
      } 
     } 
    } 

我的一個collegue的要求我修改如下圖所示:

public class TemplateController : AutoVHCBaseApiController 
    { 
     private readonly ITemplateManager manager; 
     public TemplateController() 
     { 
      manager = new TemplateManager(); 
     } 

     [Route("{id}")] 
     [HttpGet] 
     [ResponseType(typeof(VHC.Core.Common.Beans.CheckTemplate))] 
     public IHttpActionResult Get(int id) 
     { 
      try 
      { 
       CheckTemplate checkTemplate = manager.GetCheckTemplate(id, SiteCode); 
       return Ok(checkTemplate); 
      } 
      catch (ValidationException ex) 
      { 
       return BadRequest(ex.Message, FailureReason.ReasonCodeOptions.ValidationError); 
      } 
     } 
    } 

我爲什麼要建立在一個constuctor實例? 這兩個代碼與創建實例有什麼不同?

回答

3

第一個代碼是緊密耦合,這意味着trouble:你不能單元測試你的動作,因爲它取決於具體的TemplateManager

第二個代碼更好一點,因爲創建具體的TemplateManager的動作不是responsible,但它仍然緊密耦合,因爲該類仍負責創建。

更好的解決方案是使用IOC容器來處理項目範圍內的依賴項注入。例如。 Ninject也處理IDisposable,所以你不必自己撥打Dispose()

private readonly ITemplateManager _manager; 
public TemplateController(ITemplateManager manager) 
{ 
    _manager = manager; 
} 

這樣的嘲諷ITemplateManager manager的行爲,而不是依賴於具體的TemplateManager你可以單元測試你Get行動。

+2

我同意Petre - DJ(依賴注入)是做這件事的最好方法。 –

相關問題