Используя статические методы или нет статических методов в классе Дао? - PullRequest
13 голосов
/ 26 марта 2010

Привет, я генерирую классы Дао для некоторых операций с БД.

таким образом сделать методы класса 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 ]

12 голосов
/ 26 марта 2010

Это приведет к большому беспорядку. Если вы добавляете 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();
      // ...
  }
}
6 голосов
/ 01 апреля 2010

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

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

3 голосов
/ 26 марта 2010

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

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

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

0 голосов
/ 17 ноября 2017

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

0 голосов
/ 17 апреля 2015

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

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

...