3

NinjectでMVC3を使用していますが、コントローラーの依存関係は問題なく解決されています。ローカリゼーション、フォーマットプロバイダーなどのサービスがほとんどないので、それらをビューモデルまたはRazorビューに挿入したいと思います。現在、ビューモデルに手動で挿入しています。

  1. どうすればこれを自動化できますか?
  2. Razorビューにいくつかのサービスを注入できますか?
  3. MVCでNinjectを使用してサービスロケーターを設定するにはどうすればよいですか?

その他の場合: Ninjects Bootstrapper.Kernelは廃止され、Service Locatorはアンチパターンであるため、ServiceLocatorは悪い考えのようです。この記事をチェックしてくださいhttp://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

_

public class HomeController : Controller
{
    //This gets injected correctly
    [Inject]
    public ILocalizationService LocalizationService { get; set; }

    //This gets injected correctly
    [Inject]
    public MyModel Model { get; set; }

    public ActionResult Index()
    {
        var modelResult = Model.GetStuff();
        //Here I am manully injecting my services to my View Model,
        //I would like Ninject to inject services into my view model.
        var viewModelResult = IndexViewModel.Covert(LocalizationService, modelResult);
        return View(viewModelResult);
    }


    public ActionResult About()
    {
        return View();
    }
}
4

2 に答える 2

3

NinjectのMVC3プラグインを使用している場合は、使用可能なすべてのフックを作成することをお勧めします。Razorビューがサポートされていると思います。通常のV​​iewクラスを拡張するクラスを作成し、そのクラスに挿入された依存関係を追加すると、Ninjectはそれらのアイテムを挿入して、Viewで使用できるようになると思います。

私の見解では、適切な依存関係にアクセスするためにシングルトンベースのServiceLocatorパターンを間接的に使用するカスタムHtmlHelperベースの拡張メソッドを使用することを好みました。言うのが意味がないHtml.MyMethod(...)、またはUrl.MyMethod(...)そのようなことを見つけた場合は、含めようとしているアイテムがビューに属していない可能性が高くなります。

同様に、モデルオブジェクトは通常、最小限のロジックが関連付けられたPOCOである必要があります。それらにサービスを投入することは、MVCモデルの違反のように聞こえます。Jasonが指摘しているように、コントローラーのコードからモデルにフォーマットプロバイダーを設定するだけで済みます。thoseただし、フォーマットプロバイダーを使用して、必要な文字列を生成し、代わりにモデルに配置する方がよいと思います。

ジェイソンの投稿へのコメントへの回答

アプローチ1は、コントローラーが複雑になっているように聞こえるので、良い考えのように聞こえます。これは、懸念事項を別のクラスに分けるのに適した場所です。Converter静的クラスとして使用するのではなく、それ自体をコントローラーに注入する場合、Ninjectがコントローラーを作成するときに、その依存関係が自動的に注入されます。

public class HomeController : Controller
{
    [Inject]
    public ViewModelConverter Converter { get; set; }

    [Inject]
    public MyModel Model { get; set; }

    public ActionResult Index()
    {
        var modelResult = Model.GetStuff();
        var viewModelResult = Converter.MakeViewModel(modelResult);
        return View(viewModelResult);
    }


    public ActionResult About()
    {
        return View();
    }
}

public class ViewModelConverter
{
    [Inject]
    public ILocalizationService LocalizationService { get; set; }
    
    public ViewModel MakeViewModel(MyModel model)
    {
        // You should be able to use LocalizationService here
    }
}

個人的にはコンストラクターインジェクションを使用したいのですが、私はこれについてあなたのプロパティベースのインジェクションに固執しました。

于 2011-08-09T15:02:44.557 に答える
1

フォーマットプロバイダーをコントローラーに挿入し、作成時にViewModelに設定します。

于 2011-08-09T14:55:07.773 に答える