Где находится ЛУЧШАЯ ПРАКТИКА для размещения списка стран в приложении MVC? - PullRequest
0 голосов
/ 26 января 2012

В приложениях с тяжелым окружением у нас есть пользователи, местоположения, бла-бла-бла ... и мы используем во многих ситуациях вызов службы, где мы получаем список стран.

Где «наилучшая практика» или «правильный путь» для реализации этого. Этот метод вызывается в нескольких местах, и многие объекты имеют свойство List<CountryVO>.

Специально учитывая использование Razor, часто приходится добавлять это свойство в ModelViews

В решении используется архитектура DAL / BLL / SERVICE / UI [s].

Реальный пример:

public class User {
...
...
public List<DeliveryZoneVO> DeliveryZones {get;set;}
    public User() {
    ...
        DeliveryZones = service.GetDeliveryZones().ToList();
    }
}

Класс DeliveryZoneVO происходит от веб-службы, поэтому одно свойство равно

int IdCountry

У класса User есть список DeliveryZoneVO, представленный в классе, здесь «проблема» в том, что, поскольку он получает данные из веб-службы, у меня есть только идентификатор страны.

Когда я готовлю данные в контроллере для отправки на просмотр:

UserModelView userMV = new UserModelView();
userMV.user = service.GetUserById(1);
ViewData.Model = userMV;

НО, внутри userMV.user у меня есть DeliveryZones со списком объектов DeliveryZoneVO с IdCountries.

В представлении, когда я делаю (например):

@DisplayFor(m => m.user.DeliveryZones)

Я хочу показать название страны, только иметь идентификатор. Поэтому мне нужна ссылка где-то ... вопрос заключается в том, где следует размещать эти данные, которые считаются ЛУЧШИМИ ПРАКТИКАМИ.

Имеет ли во всех моделях вида (в случае примера UserModelView () свойство «Страны со списком»?

)

Ответы [ 2 ]

1 голос
/ 26 января 2012

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

в BaseController поместите статическое свойство List<CountryVO> только с getter, таким образом, оно будет инициализировано один раз и будет доступно для всех ваших контроллеров и представлений (если вы передадите его с помощью ViewModel или ViewBag).


Пример:

public class BaseController : Controller
{
    private static List<CountryVO> _allCountries;

    public static List<CountryVO> AllCountries
    {
        get{ return _allCountries ?? _GetCountriesFromSomeWhere();}
    }       
}

public class HomeController : BaseController 
{
    public ActionResult Index()
    {
        ViewBag.AllCountries  = this.AllCountries;          
        return View();
    }
}
1 голос
/ 26 января 2012

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

    const string cacheId = "deliveryZones";

    public List<DeliveryZoneVO> GetDeliveryZones()
    {
        List<DeliveryZoneVO> deliveryZones = (List<DeliveryZoneVO>)HttpRuntime.Cache.Get(cacheId);
        if (deliveryZones == null)
        {
            deliveryZones = service.GetDeliveryZones().ToList();
            System.Web.HttpContext.Current.Cache.Insert(cacheId, deliveryZones);
        }
        return deliveryZones;

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