在繁重的环境应用程序中,我们有用户,位置,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类来自webservice,因此一个属性是
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。所以我需要在某个地方引用..问题在于需要放置哪些数据才被认为是最佳实践。
是否在所有modelview中(在示例的情况下,UserModelView()属性具有List的国家?
答案 0 :(得分: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;
}
答案 1 :(得分:1)
这是一件好事,因为这类问题是从BaseController
派生的controller
类,以及从中派生的所有其他控制器。
BaseController
中的只将静态List<CountryVO>
属性设置为getter,这样它将被初始化一次,并且可以被所有控制器和视图访问(如果你使用{{{ 1}}或ViewModel
)。
示例:
ViewBag