Подходят ли статические методы для Linq To SQL DAL?

Я использую Linq to SQL для своего DAL и слышал разные вещи об использовании статических методов в веб-приложении (относительно проблем с потоками/конкурентностью). На данный момент я создал тестовый DAL, который работает нормально. Однако есть ли проблемы с тем, как я его создал, поскольку он статичен?

    public static class TestDAL
    {


        public static bool GetUserAddress(string username)
        {
            testDBDataContext dbContext = new testDBDataContext();
            //Linq code goes here

        }


        public static void InsertUserNumber(int userID)
        {
            testDBDataContext dbContext = new testDBDataContext();
            //...
            dbContext.UserDetails.InsertOnSubmit(nUser);
            dbContext.SubmitChanges();

        }

       //etc... All the methods are created in the same way 


    }

Подходит ли этот метод для веб-приложения или в производственной среде возникнут проблемы?

Спасибо.


person Skoder    schedule 10.02.2010    source источник
comment
Что вы слышали о многопоточности/параллелизме?   -  person ScottE    schedule 10.02.2010
comment
@ScottE: я никогда не слышал ничего подробного (отчасти поэтому я решил спросить здесь), но я помню, как видел сообщение, в котором утверждалось, что могут быть проблемы, из-за которых данные одного пользователя смешиваются с другими, поскольку они получили доступ к Методы DAL одновременно.   -  person Skoder    schedule 10.02.2010


Ответы (3)


Пока ваши статические методы не используют какое-либо общее состояние (состояние уровня класса или другое глобальное состояние), они сами по себе не вызовут никаких проблем при работе в многопоточной среде. Каждый вызов статического метода будет создавать копии своих собственных локальных переменных.

person Jeff Sternal    schedule 10.02.2010
comment
@Джефф: Спасибо за ответ. Нет, в этом отношении методы в значительной степени автономны. Я просто помню, что видел несколько статей L2S, и у них, казалось, был нестатический класс только с одним экземпляром DataContext (который используется другими методами). Я просто хотел убедиться, что метод, который у меня есть, с новыми DataContexts, создаваемыми для каждого метода, не будет проблематичным. - person Skoder; 10.02.2010
comment
Извините, забыл спросить. Если один метод вызывает другой метод, будет ли это считаться общими переменными (где любой метод также может быть вызван по отдельности)? Или каждый метод все равно будет создавать свою собственную локальную переменную? - person Skoder; 10.02.2010
comment
Статические методы могут вызывать друг друга, не вызывая проблем с потоками, если оба метода используют только локальные переменные (и параметры метода). Чтобы узнать, что поставлено на карту при работе в многопоточной среде (например, веб-приложении), и что может пойти не так, я рекомендую прочитать часто рекомендуемую книгу Джозефа Альбахари Threading in C# (по адресу albahari.com/threading) и Многопоточность Джона Скита в .NET (yoda.arachsys.com/csharp/threads). - person Jeff Sternal; 10.02.2010
comment
Спасибо Джефф, это отличные ссылки - person Skoder; 11.02.2010

Лично я бы избегал статических методов, так как это значительно усложнит тестирование этого кода. Вы не сможете легко смоделировать DAL при тестировании кода, который его использует. Обратите внимание, что это не уникально для LINQ или уровней доступа к данным, это просто функция кода, являющегося методом класса, а не методом экземпляра.

person tvanfosson    schedule 10.02.2010
comment
@tvanfosson: Спасибо за совет. Текущий проект довольно мал, поэтому тестирование не является решающим фактором. Тем не менее, я обязательно буду иметь в виду методы экземпляра при работе над более крупным проектом. - person Skoder; 10.02.2010

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

person Darin Dimitrov    schedule 10.02.2010
comment
@Дарин: Спасибо за ответ. Другие методы довольно общие, но ни один из них не использует глобальные переменные. - person Skoder; 10.02.2010