2017-01-06 58 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(依赖注入)是做这件事的最好方法。 –

相关问题