ASP.NET MVC: я должен передать примитивы своим действиям или использовать связыватели моделей? - PullRequest
2 голосов
/ 11 сентября 2009

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

Возьмите сущность и ряд примитивных параметров. Запишите значения из примитивных параметров в те же именованные параметры в моей сущности. Подтвердите сущность. Сохраните объект, если он действителен.

У меня уже есть связыватель модели, который будет связывать все, что унаследовано от IDataEntity (интерфейс, который реализуют все персистентные сущности нашей базы данных). Этот механизм связывания находит соответствующий репозиторий и ищет сущность с переданным идентификатором.

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

например, метод, который в настоящее время выглядит следующим образом:

    public ActionResult SaveCompanyAddress(Address address,
        string address1,
        string address2,
        string address3,
        string city,
        string county,
        Country country,
        string postcode)
    {
        address.Address1 = address1;
        address.Address2 = address2;
        address.Address3 = address3;
        address.City = city;
        address.County = county;
        address.Country = country;
        address.Postcode = postcode;

        Validate(address);

        if (ModelState.IsValid)
        {
            using (var tran = TransactionFactory.CreateTransaction())
            {
                addressRepository.Save(entity);
                tran.Commit();
            }

            return this.RedirectToAction(x => x.List(address.Company));
        }
        else
        {
            return View("Edit", address);
        }
    }

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

Мысли? Opnions? Идеи?

1 Ответ

2 голосов
/ 11 сентября 2009

Вы также можете пойти на компромисс и использовать связыватель модели по умолчанию, чтобы связать ваши простые свойства и получить сложные свойства от поставщика значений и заполнить их «вручную». Для модели, имеющей только простые свойства, связующего по умолчанию для модели будет достаточно. Для тех, кто имеет одно или два сложных свойства, те, которые не обрабатываются связывателем модели по умолчанию, вы все равно можете сохранить значительные объемы кода без необходимости написания настраиваемого связывателя модели. Сложный код привязки может быть написан с использованием общих методов класса. Как только код привязки в вашем контроллере должен пересечь границы контроллера или стать значительным, рефакторинг его в привязку пользовательской модели.

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