3

デフォルトの MVC テンプレートは「@DateTime.Now.Year」を使用して著作権年を表示しますが、どこでも NodaTime を使用したいと思います。

現在、Ninject を使用して、特定の時間または日付を実行するコントローラーに IClock のインスタンスを挿入しています。「DateTime.Now」と同様に、MVC で「グローバル IClock」にアクセスするための推奨される方法はありますか? IClock をすべての Controller に注入し、それをすべてのビューに渡すことができると思いますが、時々グローバルなものにアクセスできると便利です。

レイアウト テンプレートで SystemClock.Instance を使用できることはわかっています...代わりに、グローバルでテスト可能な IClock を参照する方がはるかに優れています。

4

2 に答える 2

5

子アクションを使用できます。

通常どおり依存性注入を使用でき、子アクションを含むコントローラーを作成することから始めます。

public class CopyrightController: Controller
{
    private readonly IClock clock;
    public CopyrightController(IClock clock)
    {
        this.clock = clock;
    }

    [ChildActionOnly]
    public ActionResult Index()
    {
        // In this example I am directly passing the IClock instance
        // to the partial view as model but in a real application
        // you might want to use a view model here
        return PartialView(this.clock);
    }
}

そして、対応する部分ビュー ( ~/Views/Copyright/Index.cshtml)を持つことができます。

@model IClock
<div>Copyright ...</div>

最後に、_Layout でこの子アクションを呼び出します。

<footer>
    @Html.Action("Copyright", "Index")
</footer>
于 2013-02-18T22:35:37.650 に答える
0

Ayende Rahien によるこの投稿で詳しく説明されているように、テスト可能な を探している場合はDateTime.Now、 を使用できます。デフォルトの を作成できますが、テストで特定の日付に設定できます。別の依存関係を導入する必要がなくなります。関数は次のとおりです。SystemTime.Now()Func<DateTime>DateTime.Now

public static class SystemTime
{
public static Func<DateTime> Now = () => DateTime.Now;
}

どこで使用する場合でも、代わりに使用DateTime.Nowする必要がありますSystemTime.Now。次のようにテストで設定できます。

SystemTime.Now = () => new DateTime(2012, 7, 1).Date;

日付の使用について十分なテスト カバレッジがある場合は、日付のDateTime.Now代わりに使用しているすべてのインスタンスをキャッチする必要があります。SystemTime.Now

于 2013-02-18T23:09:53.553 に答える