Если я постоянно перестраиваю свою модель представления после постов, это свидетельствует о серьезном недостатке дизайна? - PullRequest
0 голосов
/ 07 марта 2019

Я уже довольно давно создаю новое приложение ASP.NET MVC 5, и теперь, когда я нахожусь на последнем этапе сборки моего приложения, что-то для меня очень очевидно.У меня есть несколько почтовых вызовов в моих контроллерах, и после каждого, после проверки, я следую архитектуре PRG, которая затем позволяет мне передавать некоторые параметры в URL для запроса GET, который затем перестраивает мою ViewModel с информацией, которую яизвлеченные из поста, а также любая информация, сохраненная в базе данных, информация, скрываемая в строителях и т. д., и мне было любопытно, действительно ли это нужно делать?

Моя ViewModel довольно сложна, используетсписки моделей для заполнения раскрывающихся списков в моем представлении, и у меня также есть другие модели в качестве переменных в моей viewmodel, которые я затем заполняю для использования в своем приложении соответствующим образом.

Конечно, у меня есть около 5 DropDownLists в одном из моихГлавные виды, и каждый раз, когда я делаю сообщение, я должен следовать PRG и затем вызывать слой репозитория, чтобы снова заполнить все выпадающие списки, даже если они каждый раз представляют одну и ту же информацию.Я просто думаю, что должен быть лучший способ, но, возможно, я ошибаюсь.

Примеры кода:

public ViewResult RgaByRgaNumber(string strRgaNumber)
{
    var vm = new ReturnGoodsAuthorizationViewModel()
    {
        RGA = _returnGoodsAuthorizationRepository.GetSpecificByRGANumber(strRgaNumber),
        RGAItems = _returnGoodsAuthorizationItemRepository.GetByRgaNumber(strRgaNumber),
        ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
        ReasonCodes = _reasonCodeRepository.GetAll(),
        RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
        Customers = _customerRepository.GetAll(),
        IsUserAllowedToClickOpenCloseRGAButton = _returnGoodsAuthorizationRepository.GetUserAllowedToClickOpenCloseRGAButtonStatus(User.Identity.NameWithoutDomain())
    };
    vm.SubmitButtonText = vm.GetSubmitButtonText();
    vm.RGAClosedOpenStatusText = vm.GetRgaClosedOpenStatusText();
    vm.Customer = vm.Customers.First(x => x.CustomerId == vm.RGA.CustomerNumber);
    vm.Items = _itemRepository.GetAll(vm.RGA.CustomerNumber);
    return View("Index", vm);
}

public ViewResult Index()
{
    var vm = new ReturnGoodsAuthorizationViewModel()
    {
        ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
        ReasonCodes = _reasonCodeRepository.GetAll(),
        RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
        Customers = _customerRepository.GetAll(),
        RGA = new ReturnGoodsAuthorization()
        {
            PreparedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            AuthorizedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            CreateUser = User.Identity.NameWithoutDomain().ToUpper()
        }
    };
    return View("Index", vm);
}

public ViewResult GetCustomerItemList(string strCustomerNumber)
{
    var vm = new ReturnGoodsAuthorizationViewModel()
    {
        ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
        ReasonCodes = _reasonCodeRepository.GetAll(),
        RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
        Customers = _customerRepository.GetAll(),
        RGA = new ReturnGoodsAuthorization()
        {
            PreparedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            AuthorizedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            CreateUser = User.Identity.NameWithoutDomain().ToUpper()
        }
    };
    vm.RGA.CustomerNumber = strCustomerNumber;
    vm.Customer = vm.Customers.First(x => x.CustomerId == strCustomerNumber);
    vm.Items = _itemRepository.GetAll(strCustomerNumber);
    Session["ReturnGoodsAuthorizationViewModel"] = vm;
    return View("Index", vm);
}

 public ViewResult GetItemPrice(string strCustomerNumber, string strItemNumber)
        {
            if (Session != null && Session["ReturnGoodsAuthorizationViewModel"] != null)
            {
                var vm = (ReturnGoodsAuthorizationViewModel)Session["ReturnGoodsAuthorizationViewModel"];
                vm.ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll();
                vm.ReasonCodes = _reasonCodeRepository.GetAll();
                vm.RestockFeeOptions = _restockFeeOptionRepository.GetAll();
                vm.Customers = _customerRepository.GetAll();
                vm.RGA.CustomerNumber = strCustomerNumber;
                vm.Items = _itemRepository.GetAll(strCustomerNumber);
                vm.Item = vm.Items.First(m => m.Number == strItemNumber);
                vm.SubmitButtonText = vm.GetSubmitButtonText();
                vm.RGAClosedOpenStatusText = vm.GetRgaClosedOpenStatusText();
                vm.IsUserAllowedToClickOpenCloseRGAButton = _returnGoodsAuthorizationRepository.GetUserAllowedToClickOpenCloseRGAButtonStatus(User.Identity.NameWithoutDomain());
                Session["ReturnGoodsAuthorizationViewModel"] = vm;
                return View("Index", vm);
            }
            else
            {
                var vm = new ReturnGoodsAuthorizationViewModel()
                {
                    ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
                    ReasonCodes = _reasonCodeRepository.GetAll(),
                    RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
                    Customers = _customerRepository.GetAll(),
                    RGA = new ReturnGoodsAuthorization()
                    {
                        PreparedByUser = User.Identity.NameWithoutDomain().ToUpper(),
                        AuthorizedByUser = User.Identity.NameWithoutDomain().ToUpper(),
                        CreateUser = User.Identity.NameWithoutDomain().ToUpper()
                    }

                };
                vm.IsUserAllowedToClickOpenCloseRGAButton = _returnGoodsAuthorizationRepository.GetUserAllowedToClickOpenCloseRGAButtonStatus(User.Identity.NameWithoutDomain().ToUpper());
                vm.RGA.CustomerNumber = strCustomerNumber;
                vm.Item = _itemRepository.GetItem(strCustomerNumber, strItemNumber);
                vm.Items = _itemRepository.GetAll(strCustomerNumber);
                Session["ReturnGoodsAuthorizationViewModel"] = vm;
                return View("Index", vm);
            }
        }

1 Ответ

0 голосов
/ 07 марта 2019

Первое, что я хотел бы предложить, - это начать использовать кэш уровня приложения. Начните с чтения здесь: https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications

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

Эти 5 выпадающих меню, о которых вы говорите, вписываются в эту категорию. Я не очень понимаю, почему вы думаете, что простой шаблон заставляет вас перезагрузить данные. Нам, как разработчикам, нужен здравый смысл. Если это не правильно, не делайте этого, независимо от того, что говорит шаблон. Шаблоны здесь, чтобы помочь, а не заставлять вас делать неправильные вещи, неоднократно.

Далее начните смотреть на ваш код, не вызывайте один и тот же метод снова и снова. Примером может быть следующий код:

public ViewResult Index()
{
    var vm = new ReturnGoodsAuthorizationViewModel()
    {
        ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
        ReasonCodes = _reasonCodeRepository.GetAll(),
        RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
        Customers = _customerRepository.GetAll(),
        RGA = new ReturnGoodsAuthorization()
        {
            PreparedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            AuthorizedByUser = User.Identity.NameWithoutDomain().ToUpper(),
            CreateUser = User.Identity.NameWithoutDomain().ToUpper()
        }
    };
    return View("Index", vm);
}

с очень простым изменением это может выглядеть так:

public ViewResult Index()
{
    string username = User.Identity.NameWithoutDomain().ToUpper();

    var vm = new ReturnGoodsAuthorizationViewModel()
    {
        ReturnGoodsAuthorizations = _returnGoodsAuthorizationRepository.GetAll(),
        ReasonCodes = _reasonCodeRepository.GetAll(),
        RestockFeeOptions = _restockFeeOptionRepository.GetAll(),
        Customers = _customerRepository.GetAll(),
        RGA = new ReturnGoodsAuthorization()
        {
            PreparedByUser = username,
            AuthorizedByUser = username,
            CreateUser = username
        }
    };
    return View("Index", vm);
}

затем посмотрите на код еще немного и начните задавать вопросы, такие как:

  • вам действительно нужно загрузить всех клиентов?
  • должен ли метод GetItemPrice вызывать базу данных 10 раз для загрузки такого количества данных?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...