#c# #asp.net #.net #asp.net-mvc #session
#c# #asp.net #.net #asp.net-mvc #сессия
Вопрос:
У меня есть BusinessLayer, который содержит коллекции и повторно используемый код в старом настольном приложении.
Теперь я хочу снова использовать этот слой в приложении MVC. Я пытаюсь использовать слой в контроллере, например, Index()
public ActionResult Index()
{
if (Session["DataEntryLogic"] == null)
Session["DataEntryLogic"] = new DataEntryLogic();
var EntryLogic = Session["DataEntryLogic"] as DataEntryLogic;
EntryLogic.Tables.Add(new Table());
EntryLogic.Tables[0].TableID = "AccTransHed";
EntryLogic.Tables[0].TableType = TableType.Master;
}
Теперь я хочу сохранить таблицы, которые я добавил при загрузке первого представления. и сделайте его неизменяемым в следующих сообщениях. Я использовал сеанс. Я не знаю, следует ли вместо этого использовать ViewBag или ViewData.
Короче говоря: какому шаблону я должен следовать для создания неизменяемого BusinessLayer?
Потому что каждый раз, когда происходили откаты, мне не нужно снова и снова получать табличную информацию, ключи или саму логику.
Обновлено 2019/04/14
Должен ли я заменить все свойства и коллекции BusinessLogic на этот шаблон?
в приложении Windows:
pulic class EntryLogic{
public List<Table> Tables{get;set;}
}
В приложение MVC:
public class EntryLogic{
public List<Table> Tables{
get{
if(Session["Tables"] == null)
Session["Tables"] = new List<Table>();
return Session["Tables"] as List<Table>;
}
set { Session["Tables"] = value;}
}
}
Или просто инициализировать экземпляр EntryLogic настольного приложения в переменной сеанса?
var EntryLogic = Session["EntryLogic"] as EntryLogic;
Комментарии:
1. Session и ViewBag не являются хорошими инструментами для выполнения такой работы. Для быстрого и простого решения вы можете использовать шаблон «Singleton».
2. я обновил вопрос, чтобы добавить больше очков. я не знаю, какой шаблон хорош? преобразуйте целые свойства слоя в сеансы или просто добавьте сеанс этого слоя и работайте со свойствами напрямую
Ответ №1:
Для меня это звучит так, как будто вы можете использовать кэширование, чтобы уменьшить количество обращений к базе данных и не беспокоиться о сохранении состояния.
Ответ №2:
Прежде всего, я не думаю, что вы хотите использовать слой при индексе, но при запуске приложения. Также, если вы собираетесь использовать сеанс, это означает, что у каждого пользователя будет свой набор таблиц.
Это сводится к:
- Являются ли коллекции одинаковыми для каждого пользователя? Если они есть, то вы хотите инициализировать их в запуске приложения
- То же самое относится и к статическим переменным. Используя статическую переменную, она будет использоваться всеми действиями и пользователями.
- Если у каждого пользователя свой набор таблиц и ключей, и они различны, то сеанс yes можно использовать для хранения любой переменной, которую вы хотите.
Также:
- ViewBag и ViewData одинаковы. Вы можете использовать либо.
Это ваш статический класс с коллекцией
Здесь вы инициализируете и заполняете коллекцию
И вот как вы используете свою коллекцию для контроллеров.
Комментарии:
1. ОК. должен ли я переписать запись LogicLayer и заменить коллекцию на Session [«Collection»] и все переменные на этот шаблон? или просто добавить экземпляр LogicLayer внутри самого состояния сеанса?
2. Логика входа не должна быть изменена и одинакова для всех пользователей. и для целых приложений. он должен выглядеть как приложение Windows.
3. Затем вы создадите статический класс, который будет содержать эти коллекции, статический класс будет инициализирован при запуске приложения. Если вы использовали session, то для каждого пользователя будет отображаться одна и та же коллекция.
4. Мне не нужно создавать больше вещей. он уже создан. но сама BusinessLogic является классом. прочитайте обновленное выше в вопросе. У каждого представления есть свой собственный экземпляр класса EntryLogic, который содержит определения таблицы
5. Как он создается? Очевидно, что это не так, иначе вы бы не инициализировали снова, как кажется. Также сеанс отличается для каждого пользователя. Сеанс не работает. Если бы у вас было 100 элементов и 1000 пользователей, то в итоге вы получили бы количество элементов = 100 * 1000. Предоставленный вами код ничего не инициализирует и ничего не создает. Данных нет.