Использование статических методов или нет статических методов в классе Dao?

Hi я генерирую классы Dao для некоторых операций БД

таким образом, создание методов класса Dao как статических или нет статических лучше?

используя пример класса dao ниже, если несколько клиентов должны использовать метод AddSampleItem одновременно?как это может произойти?

public class SampleDao
{
  static DataAcessor dataAcessor 

  public static void AddSampleItem(object[] params)
  {
      dataAcessor =new DataAcessor();
       //generate query here
       string query="..."
      dataAcessor.ExecuteQery(query);
      dataAcessor.Close(); 
   }

  public static void UpdateSampleItem(object[] params)
  {
      dataAcessor =new DataAcessor();
       //generate query here
       string query="..."
      dataAcessor.ExecuteQery(query);
      dataAcessor.Close(); 
   }
}

5 ответов


это приведет к большому беспорядку. Если вы добавляете 2 элемента одновременно из разных потоков, вы, безусловно, получите очень странные результаты или даже ошибки, если один поток закроет DataAcessor прежде чем другой завершает.

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

public class SampleDao
{
  public void AddSampleItem(object[] params)
  {
      DataAcessor dataAcessor =new DataAcessor();
      // ...
  }

  public void UpdateSampleItem(object[] params)
  {
      DataAcessor dataAcessor =new DataAcessor();
      // ...
  }
}

Я всегда предпочитаю нестатические классы. Зависимости нельзя вводить в статический класс, а модульные тесты сложнее. Кроме того, его клиенты не могут заменить его тестовым двойником при модульном тестировании.

http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html


этот код не является потокобезопасным, как вы его написали.

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

избавьтесь от статики в этих методах и этом поле и создайте новый экземпляр SampleDao для каждого клиент.


назначение нового объекта DataAccessor статической ссылке на DataAccessor в каждом методе приведет к проблемам параллелизма. У вас все еще могут быть статические методы в классе SampleDao, но убедитесь, что вы удалили статическую ссылку на DataAccessor. Чтобы использовать DataAccessor, создайте локальный экземпляр. Таким образом, можно избежать проблем параллелизма. Недостатком здесь является каждый раз, когда вы вызываете статический метод, создается экземпляр DataAccessor.

Daos в большинстве случаев являются апатридами.В в этих случаях я не вижу смысла иметь нестатические методы в Daos, потому что нам нужно создать экземпляр этого dao для доступа к его методу.


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