2017-01-06 3 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); 
      } 
     } 
    } 

Один из моей коллеги попросил меня изменить, как показано ниже:

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.

Второй код немного лучше, потому что действие не responsible для создания конкретного TemplateManager, но оно по-прежнему тесно связано, потому что класс по-прежнему несет ответственность за создание.

Лучшим решением является использование контейнера IOC для обработки проекта внедрения инъекций. например. Ninject также обрабатывает IDisposable, поэтому вам не нужно звонить Dispose() самостоятельно.

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

Таким образом, вы можете проверить свои блок Get действия, насмехаясь поведением ITemplateManager manager пока не в зависимости от конкретного TemplateManager.

+2

Я согласился с Petre - DJ (инъекция зависимостей) - лучший способ сделать это. –

Смежные вопросы