Я переписываю классическое веб-приложение asp с помощью ASP.NET MVC 5.
В настоящее время существует много общего кода, содержащегося в файлах include, которые мне нужно реплицировать в моем новом приложении.
Я провел много исследований и считаю, что статические методы - это путь.
Я планирую использовать статические методы для утилит, которые используют только локальные данные или входные параметры (кроме объектов)
Я планирую использовать методы экземпляра для утилит, которые должны создавать экземпляры других объектов и т.д.
Мой вопрос:
С установкой IIS в InProc, являются ли статические методы автономными или могут ли они непреднамеренно перекрещиваться с другими пользователями?
Это приложение будет установлено на одном сервере, нет веб-ферм или коллекций серверов и т.д.
Ive также видел упомянутые выше методы расширения, но Microsoft предлагает использовать их экономно. В конечном счете, есть ли лучший способ заменить общий код в include файлах, кроме статических методов?
Спасибо за прочтение.
Отвлекаясь от обсуждения архитектуры (в классическом ASP был распространен доступ к доступу к данным в служебных процедурах - я не думаю, что вы захотите реплицировать этот MVC, гораздо лучше спроектировать несколько хороших слоев и абстрагировать все эти обработки данных в вашей модели).
Чтобы ответить на ваш основной вопрос, да, статические методы автономны, если вы не обращаетесь к глобальным переменным. Т.е.
public static string somestring = "xyz";
public static void DoSomething()
{
somestring = "something else";
}
Будет действительно сосать и раздуваться в многопользовательской среде.
И чтобы ответить на ваш последний вопрос, см. Мой первый абзац. Лучшим способом было бы разработать модель (доступ к данным для всех) в модель домена, а уровень доступа к данным - в этом случае. По крайней мере, рефакторинг методов доступа к данным в какой-то форме уровня DataAccess, инкапсулирует это за набором интерфейсов - и даже если у вас нет времени/ресурсов, чтобы переписать доступ к данным в лучшем виде сейчас, вы будете по крайней мере, нарисовали линию в песке, чтобы запрограммировать ее. Таким образом, вы остановите старый kludge, превратив его в свой прекрасный новый код.
В вашем вопросе есть два аспекта:
1. Способ доступа к вашему общему коду из разных мест вашего кода.
2. Способ реализации общих данных в этом общем коде.
Даже если ваш проект прост, попробуйте его использовать, и тогда он станет вашей привычкой. Как правило, да, вы можете просто использовать статические классы и шаблон Singleton, однако в более крупных проектах лучше всего использовать DI вместо этого, позволяя быть более гибким и готовым к тестированию.
Итак, это как "да" как "нет". Как правило, они вроде потокобезопасны (сами классы (по определению MS)), но в зависимости от вашей реализации определенной логики, которая может быть опасной.
var s = MyAppDependencyResolver.GetService<ITheServiceInterface>(); s.MethodNeeded();
Вы должны быть в порядке со статическими методами. То, что вам нужно, это статические данные. Если вы используете это, вам нужно помещать блокировки в данные каждый раз, когда вы хотите их использовать. Например:
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;
}
}
}
Вы не просто выбираете один тип метода или другой. Вы используете то, что имеет смысл для метода. Если ваш метод взаимодействует только с данными, переданными в него, особенно если эти данные не являются общими (также статическими), тогда его можно сделать статическим. В противном случае вы используете методы экземпляра, но опять же это определение делается в каждом конкретном случае, а не один раз для вашего приложения в целом.