Лучший метод для централизованного общего кода через веб-приложение MVC?

1

Я переписываю классическое веб-приложение asp с помощью ASP.NET MVC 5.

В настоящее время существует много общего кода, содержащегося в файлах include, которые мне нужно реплицировать в моем новом приложении.

Я провел много исследований и считаю, что статические методы - это путь.

Я планирую использовать статические методы для утилит, которые используют только локальные данные или входные параметры (кроме объектов)

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

Мой вопрос:

С установкой IIS в InProc, являются ли статические методы автономными или могут ли они непреднамеренно перекрещиваться с другими пользователями?

Это приложение будет установлено на одном сервере, нет веб-ферм или коллекций серверов и т.д.

Ive также видел упомянутые выше методы расширения, но Microsoft предлагает использовать их экономно. В конечном счете, есть ли лучший способ заменить общий код в include файлах, кроме статических методов?

Спасибо за прочтение.

Теги:
asp.net-mvc

4 ответа

2
Лучший ответ

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

Чтобы ответить на ваш основной вопрос, да, статические методы автономны, если вы не обращаетесь к глобальным переменным. Т.е.

public static string somestring = "xyz";
public static void DoSomething()
{
   somestring = "something else";

}

Будет действительно сосать и раздуваться в многопользовательской среде.

И чтобы ответить на ваш последний вопрос, см. Мой первый абзац. Лучшим способом было бы разработать модель (доступ к данным для всех) в модель домена, а уровень доступа к данным - в этом случае. По крайней мере, рефакторинг методов доступа к данным в какой-то форме уровня DataAccess, инкапсулирует это за набором интерфейсов - и даже если у вас нет времени/ресурсов, чтобы переписать доступ к данным в лучшем виде сейчас, вы будете по крайней мере, нарисовали линию в песке, чтобы запрограммировать ее. Таким образом, вы остановите старый kludge, превратив его в свой прекрасный новый код.

  • 0
    Спасибо, Джим, я не достаточно опытен, чтобы полностью следовать твоему совету, поэтому я хотел бы представить свое текущее решение для критики. Я добавил проект библиотеки классов в свой проект MVC, который содержит модели в виде отдельных объектов, управляемых классами «менеджера». Эти классы менеджера также находятся в библиотеке классов и содержат методы доступа, такие как getAllCustomers (), getCustomerById () и т. Д. Эти методы содержат встроенный sql для запроса базы данных oracle. Я на правильном пути или есть лучший способ?
  • 0
    В идеальном мире вы бы создали библиотеку классов бизнес-модели, которая предоставляет ряд точек входа в бизнес-модель (этими точками входа будет ваш фасад или уровень обслуживания). Бизнес-модель будет тогда выполнять вызовы на уровне доступа к данным ... Однако есть много способов добиться того, что вы пытаетесь сделать. Ваша схема звучит как шаг в правильном направлении, однако я бы пошел дальше и перенес бы все элементы доступа к данным в другую библиотеку классов, чтобы у вас было: Уровень доступа к данным -> Бизнес-модель -> Уровень пользовательского интерфейса (с Модели пользовательского интерфейса).
Показать ещё 4 комментария
2

В вашем вопросе есть два аспекта:

1. Способ доступа к вашему общему коду из разных мест вашего кода.

2. Способ реализации общих данных в этом общем коде.

  1. Попробуйте использовать IoC (инверсия управления) и фактически инъекции зависимостей.

Даже если ваш проект прост, попробуйте его использовать, и тогда он станет вашей привычкой. Как правило, да, вы можете просто использовать статические классы и шаблон Singleton, однако в более крупных проектах лучше всего использовать DI вместо этого, позволяя быть более гибким и готовым к тестированию.

  1. Это довольно простой вопрос. Собственно, основы ASP.NET (если я не понял ваш вопрос): да, статические методы (скорее, классы) могут достижимы любым пользователем.

Итак, это как "да" как "нет". Как правило, они вроде потокобезопасны (сами классы (по определению MS)), но в зависимости от вашей реализации определенной логики, которая может быть опасной.

  • 0
    Спасибо Агат - я свободно следую за DI, но я изо всех сил пытаюсь понять, как использовать для этой цели. В качестве примера, который поможет мне понять, у меня есть статический метод, который добавляет параметр к команде запроса Oracle, которую он получает. Как бы я использовал DI для этого?
  • 0
    В двух словах. У вас есть свой собственный «сервис» (это может быть просто статический класс для внутреннего поведения, это зависит от реализации, но вы должны получить экземпляр вашего сервиса через DI (который может быть просто одиночным)). Но идея DI заключается в том, что вы указываете некоторый интерфейс. Ваш класс должен реализовать этот интерфейс. Затем вы делаете следующее: a) var s = MyAppDependencyResolver.GetService<ITheServiceInterface>(); s.MethodNeeded();
Показать ещё 3 комментария
1

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

class Account
{
    private static decimal balance;
    private static Object thisLock = new Object();

    public static void Withdraw(decimal amount)
    {
        lock (thisLock)
        {
            if (amount > balance)
            {
                throw new Exception("Insufficient funds");
            }
            balance -= amount;
        }
    }
}

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

  • 0
    "замок"???? Основной проблемой со статическими данными является не безопасность потоков (также проблема), а тот факт, что они являются общими для всех пользователей.
  • 0
    Да, и тот факт, что могут быть перекрестные ссылки, когда два пользователя используют данные одновременно.
Показать ещё 1 комментарий
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню