2

新しい MVC 4 アプリを設計する際のガイダンスを探しています。

アプリのすべてのページにurl パラメーターs=2011を配置して、使用しているデータの年を知らせたいと思います。明らかに、ユーザーは必要に応じてそのパラメーターを変更する方法があります。

すべてのコントローラーでそのパラメーターが必要になり、これを行う最善の方法を考えています。Request.QueryString年を読み取ってパブリック プロパティに入れるベース コントローラーを作成することを考えていました。ただし、MVC のすべての拡張性の点を考慮すると、これを行うためのより良い方法があるかどうか疑問に思っています。

4

1 に答える 1

1

これはアプリの設計に大きく依存しますが、2 つの選択肢を提供するだけです。

IActionFilter

リクエストごとにデータ コンテキストを実行している場合は、グローバルを使用してIActionFilterアクション前の実行をグローバルにフックし、舞台裏でデータ コンテキストにクエリ フィルターを適用できます。

これの主な欠点は、コントローラーをテストするには、actionfilter が適切に適用されるように MVC パイプラインを完全にセットアップする必要があることです。

依存性注入

サブクラス化(あなたが言うようにベースコントローラー)を使用する代わりに、依存性注入を使用できます。物事をより緩く保つことで、クエリ文字列、Cookie、データベースのユーザー設定などからフィルターを取得できます-コントローラーがどこから来たのかを知る必要はありません。

Entity Framework や Nhibernate などを使用している場合の疑似コードを次に示します (他のテクノロジにも適用できると確信しています)。

public Car
{
    public string Year { get; set; }
}

public class CarsDataContext : DbContext
{
    private IQuerable<Cars> _cars = null;
    private Func<Car, bool> _carsFilter = null;

    public IQuerable<Car> Cars {
        get {
            if (_carsFitler != null)
                return _cars.Where(_carsFitler);

            return _cars;
        } 
        set { _cars = value; }
    }

    public void ApplyCarsFilter(Func<Car, bool> predicate)
    {
        _carsFilter = predicate;
    }
}

依存性注入のセットアップ (NInject またはその他のフレームワーク) が既にあると仮定すると、コンテキストを初期化する方法を構成できます。

Bind<CarsDataContext>().ToMethod(() => {
    string yearFilter = GetYearFilter(); // can be coming from anywhere

    CarsDataContext dataContext = new CarsDataContext();
    dataContext.Applyfilter(car => car.Year == yearFilter);
    return dataContext;
}).InRequestScope();

次に、コントローラーはデータのフィルタリングについて何も知らないので、簡単にテストできます。

class MyController : Controller
{
    public MyController(CarsDataContext dataContext)
    {
    }
    ...
}

ただし、これを行うのは、データセットのフィルタリングが多くのコントローラーと私のソフトウェアの重要な部分にまたがっていることだけです。そうでなければ、それは純粋なオーバーエンジニアリングです。

于 2012-08-24T23:27:49.353 に答える