Afzaal Ahmad Zeeshan
Того, что вы писали, было более чем достаточно, прежде чем я скажу что-нибудь еще, нет также никакой необходимости делать это readonly
, поскольку вы просто используете его для доступа к данным, а не для изменения их значений (даже во втором коде).
Теперь, как вы уже сказали, использование блока эффективно, поскольку он очищает ресурсы, как только объект выходит из области видимости. Поэтому я бы предпочел использовать этот блок using вместо того, чтобы создавать экземпляр и затем обращаться к нему в функции. Есть некоторые случаи, когда вам может понадобиться использовать этот подход, например,
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 = Process(args);
return Ok(checkTemplate);
}
catch (ValidationException ex)
{
return BadRequest(ex.Message, FailureReason.ReasonCodeOptions.ValidationError);
}
// Clean up resources
manager.Dispose();
}
// Notice I have a new function
private CheckTemplate Process(params list) {
// Use manager here.
}
}
1.вам нужно получить доступ к одному и тому же экземпляру для нескольких функций — при условии, что вы не хотите полагаться на передачу параметров.
2. создание экземпляра несколько раз имеет перегрузку или задержку-загрузка диска и т. д. — В таких случаях вы можете определить один экземпляр, а затем получить доступ к его состояниям и функциям.
3. создание экземпляра объекта является избыточным во всех обработчиках методов, и вы можете минимизировать код или реализовать сухое правило, сделав это.
4. Синглтонный паттерн — но у него есть и другие реализации, даже те, которые требуют от вас не ограничивать себя.
5. ваш босс хочет, чтобы вы это сделали.
Даже если это так, то вы наверняка можете сделать следующее,
public class TemplateController : AutoVHCBaseApiController
{
private ITemplateManager manager;
public TemplateController()
{
// Not required anymore.
manager = new TemplateManager();
}
[Route("{id}")]
[HttpGet]
[ResponseType(typeof(VHC.Core.Common.Beans.CheckTemplate))]
public IHttpActionResult Get(int id)
{
try
{
// Apply using over a property.
using (manager = new TemplateManager()) {
CheckTemplate checkTemplate = Process(args);
return Ok(checkTemplate);
}
}
catch (ValidationException ex)
{
return BadRequest(ex.Message, FailureReason.ReasonCodeOptions.ValidationError);
}
}
// Notice I have a new function
private CheckTemplate Process(params list) {
// Use manager here.
}
}
Другими словами, вам нужно только свойство, если вам нужно управлять им как состоянием, или вам нужно получить к нему доступ из нескольких функций и иметь частные функции и работников, которым требуется экземпляр, в противном случае вы можете иметь вложенный блок using, который может легко сделать трюк и перед выходом очистить ресурсы.
Для меня сделать это изменение было неплохой идеей, но сделать это
readonly
и создание экземпляра в конструкторе было плохим подходом — он будет создан для
POST
,
PUT
просит тоже, даже если это не требуется.