1

在繁重的环境应用程序中,我们有用户、位置、bla bla bla ......并且在许多情况下,我们使用对检索国家列表的服务的调用。

实现这一点的“最佳实践”或“正确方法”在哪里。该方法在多个地方被调用,并且许多对象都有一个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 列表,如该类所示,这里的“问题”是因为它从 Web 服务中检索数据,所以我只有国家的 ID。

当我准备控制器中的数据以发送到视图时:

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

但是,在 userMV.user 中,我有 DeliveryZones 以及带有 IdCountries 的 DeliveryZoneVO 对象列表。

在视图中,当我这样做时(例如):

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

我想显示国家名称,只有 ID。所以我需要在某个地方提供参考。问题在于应该将这些数据放在哪里,这被认为是最佳实践。

是否在所有模型视图中(在示例的情况下, UserModelView() 具有 List 的属性国家?

4

2 回答 2

1

我将创建一个部分视图,仅负责呈现国家/地区列表。然后可以在一个地方对列表的呈现方式进行任何更改。我将创建一个模型类来封装调用服务以获取国家/地区。假设国家/地区列表是相当静态的,您可以处理模型类中的信息缓存,以减少对服务的调用并提高性能。下面是模型中的一个方法示例,该方法从服务器缓存中获取国家/地区列表(如果可用)。

    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;

    }
于 2012-01-25T20:13:18.333 回答
1

一件好事,因为这类问题是有一个BaseController派生自 的类controller,以及您从它派生的所有其他控制器。

在仅使用 getterBaseController放置静态List<CountryVO>属性中,这样它将被初始化一次,并且您的所有控制器和视图都可以访问(如果您使用ViewModelor传递它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();
    }
}
于 2012-01-25T21:00:18.583 回答