асинхронные вызовы внутри get accessor - это хорошая практика? - PullRequest
7 голосов
/ 04 октября 2010

У меня есть окно с информацией о клиенте.когда окно загружается, я вызываю метод LoadCustomer() из конструктора, который асинхронно загружает информацию о клиенте из базы данных, которая устанавливает свойство CurrentCustomer.и затем пользовательский интерфейс обновляется, потому что он привязан к CurrentCustomer.

private void LoadCustomer(Guid customerID)
{           
   var customerContext = new CustomerContext();

   var customerQuery = customerContext.GetCustomersQuery()
                                         .Where(e => e.CustomerID == customerID);

   customerContext.Load(customerQuery, 
      loadOperation =>
      {
         CurrentCustomer = loadOperation.Entities.SingleOrDefault();
      }, null);
}

Старший программист сказал мне, что лучше поместить эту логику в метод доступа get CurrentCustomer, потому что тогда

  • вызовы в базу данных будут использовать ленивую загрузку, а
  • рефакторинг будет проще.

Является ли хорошей практикой помещать асинхронные вызовы базы данных в метод доступа get свойства?

Ответы [ 3 ]

5 голосов
/ 04 октября 2010

Похоже, ваш старший разработчик пропустил асинхронную природу кода.Единственный способ перенести ваш код в метод получения свойства - это заблокировать вызывающий поток до тех пор, пока асинхронная операция не будет завершена и не будет возвращено значение.Это было бы очень плохо себя вести свойство.

4 голосов
/ 04 октября 2010

Как правило, это не так.

Обычно, если получение чего-либо подразумевает также выполнение чего-то более дорогого, вы должны использовать метод полного получения только для этой цели:

public object GetSomething() { }

// accessing code
var value = obj.GetSomething();

Это означает, что получение чего-то не является бесплатным ... Сравните с:

var value = obj.Something;

Это больше похоже на обычное присвоение значения, скрывающее опасный асинхронный вызов, происходящий за сценой, который, IMOэто плохая идея.

Но, как и со всем остальным ... это зависит также от других частей всей архитектуры.

Еслився цель объекта - абстрагировать множество асинхронных вызовов, используя свойство (например, в случае с сущностями Linq2Sql или Entity Framework), тогда это нормально, потому что вы должны знать, что имеете дело с вызовами, которые не являются (или близки к) без контекста кода.

...

Это зависит от контекста кода.Если всякий раз, когда вы получаете доступ к этой собственности, вы уверены, что вам напомнят о дорогостоящем звонке, то я думаю, что это нормально.Но если это не так, то вы должны сделать его более явным, превратив его в полноценный метод вместо свойства.

1 голос
/ 04 октября 2010

Он прав насчет того, что он загружен в метод доступа с отложенной загрузкой - поскольку асинхронный вызов не будет выполняться при создании объекта. Это будет сделано только при вызове метода доступа.

Он также ожидает, что он не оставит его в методе доступа к свойству, а проведет рефакторинг в другом месте. Рефакторинг проще, когда вызов уже изолирован в методе доступа.

Однако не стоит оставлять асинхронный вызов в методе доступа, но не похоже, чтобы он ожидал, что он останется там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...