1

重い環境のアプリケーションでは、Users、Locations、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 は Web サービスから取得されるため、1 つのプロパティは

int IdCountry

クラス User には、クラスで提示されている DeliveryZoneVO のリストがあります。ここでの「問題」は、Web サービスからデータを取得するため、国の ID しか持っていないことです。

ビューに送信するコントローラーでデータを準備するとき:

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

しかし、userMV.user 内には、IdCountries を持つ DeliveryZoneVO オブジェクトのリストを持つ DeliveryZones があります。

ビューで、(たとえば)行うと:

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

国名を表示したいのですが、IDしかありません。だから私はどこかに参照が必要です..問題は、ベストプラクティスと見なされるデータをどこに配置する必要があるかにあります。

すべてのモデルビュー(例の場合、 UserModelView() のプロパティ Countries with a List に含まれていますか?

4

2 に答える 2

1

国リストのレンダリングのみを担当する部分ビューを作成します。次に、リストのレンダリング方法を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た他のすべてのコントローラーを持つことであるため、良いことです。

ゲッターのみを使用しBaseControllerて静的List<CountryVO>プロパティを配置すると、この方法で一度初期化され、すべてのコントローラーとビューにアクセスできるようになります(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();
    }
}
于 2012-01-25T21:00:18.583 に答える