1

私はAsp.Net MVC 3の依存性注入にIoCコンテナを使用しています。アクションメソッド内でエンティティ/モデルオブジェクトを作成する最善の方法は何ですか?モデルは、コンストラクタ経由でコントローラに注入される特定のリポジトリまたはサービスから取得されることがありますが、システム内の他の多くのモデルオブジェクトではそうではありません。アクションメソッドのモデルオブジェクトを解決するためにIoCを使用する

+0

詳細をお知らせください。モデルオブジェクトの中には、リポジトリやサービスから来ていないものがある場合は、どこから来たのでしょうか? – MattDavey

+0

実際にはいくつかのステップを持つコントローラがありますが、ほとんどの場合、すべてのアクションが異なるモデルで異なるビューを生成し、モデルを表示するように設定されています。 HtmlHelperは、データを受け入れるためのフォームを表示するための拡張メソッドを使用するモデルとして設定された空のオブジェクトを必要とし、このビューのviewmodelには、特定のエンティティタイプのプロパティ、たとえば 'SiteSettings'クラスがあります。私は、ViewModelとその依存関係をActionメソッド内から解決する方法がわかりません。 –

+0

あなたが尋ねた元の質問は、あなたが求めようとしていたかもしれない質問とは異なると思います。この質問は、IOCコンテナを使用してアクション内のオブジェクトを解決する方法に関するものでした。実際の質問は、「ASP.NET MVCでウィザードを作成するにはどうすればよいですか?」というように聞こえます。そして、正しい答えは、アクションメソッド内でIOCコンテナを使用することを含むとは考えていません。新しい質問をすると、より良い解決策が得られるかもしれません。 –

答えて

3

IOCコンテナは、コンポーネントの作成に最も適しています。モデルオブジェクトの作成には使用しないでください。たとえば、これは良いです:それはIOCコンテナから解決する必要はありませんので、

public ActionResult SignUp(string username, string password) 
{ 
    var user = new User(); // Your model object 
    user.Username = username; //... 

    _repository.Save(user); 

    return Redirect(...); 
} 

モデルオブジェクトは、すべての依存関係自体を取るべきではありません。同じことは、モデルを表示するために適用されます。

public ActionResult Show(int userId) 
{ 
    var user = _repository.Load<User>(userId); 

    var model = new ShowUserModel(user); 
    return View(model); 
} 

作成後のモデル/ビューモデルは、効果的に読み取り専用である必要があり、それが必要とするすべての情報は、コントローラを介して渡す必要があります - それは、注入された依存関係を取るべきではありません。あなたは本当に、本当にアクション内コンポーネントを動的に作成する必要がなかった場合

、あなたはこのようにそれを行うことができます。

class HomeController : Controller 
{ 
    readonly Func<IFooService> _fooServiceFactory; 

    public HomeController(Func<IFooService> fooServiceFactory) 
    { 
     _fooServiceFactory = fooServiceFactory; 
    } 

    public ActionResult SomeAction() 
    { 
     var service = _fooServiceFactory(); // Resolves IFooService dynamically 
     service.DoStuff(); 
    } 
} 

まともなIOCコンテナはFunc<T>注入を処理することができるはずです。

+0

通常のコンストラクタインジェクションを使用するだけではいかがですか? Func に対して何かがあるわけではありません。 。 。 –

+0

私は同意する、理想的にはあなたが同意する。しかし、質問タイトルには「実際の目標を達成するためのよりよい方法があるとは思うが、IoCを使ってモデルオブジェクトを*アクションメソッドで解決する*」と書かれている。 –

+4

現実世界の状況は、半ダースのアクションがあり、そのうちの1つだけが 'IFooService'を必要とし、' IFooService'の作成が高価な場合があります。このような状況では、アクションに 'IFooService'の解決を延期することができるので、それを必要としないアクションでは解決されません。つまり、おそらく 'IFooService'には次のような設計上の問題があります。 –

3

アクション引数を解決するためにDIコンテナを使用しません。これは、ASP.NET MVCでmodel binderが意図していることです。そして、あなたの行動は引数としてすべてのドメインモデルを取るべきである=>彼らはビューモデルだけを取るべきです。ビューモデルは、特定のビューの要件を満たすように特別に定義されたクラスです。

特定のケースでは、アクション引数のインスタンス化とバインドを担当するカスタムモデルバインダーを作成する可能性があります。モデルバインダー自体のインスタンス化に関しては、ASP.NET MVC 3ではdependency resolverを使用できます。これを使用すると、選択したDIフレームワークを使用してこのモデルバインダーに依存関係を注入できます。

+0

モデルやビューモデルについては、投稿されたデータやパラメータについては言及していませんので、基本的なCRUDコントローラの 'Create'アクションメソッドのように、ビューに渡す必要があるデータをどのように生成しますか?したがって、Viewモデルは直接作成できますか? –

+0

@Threecoins、私はあなたが何を求めているのか分かりません。ビューに渡すデータは、ビューモデルの形式で表示されます。ビューモデルは、このビューに必要な情報を定義して含めるクラスです。コントローラのアクションは、リポジトリにクエリしてドメインモデルを取得し、このドメインモデルをビューモデルにマップし、ビューモデルをビューに渡します。たぶんあなたの問題を少し詳しく説明できるコードを表示できますか? –

+0

@DarinDimitrovこのようなモデルバインダーの実装が必要な場合は、Autofacと言うと、それはすばらしいでしょう。 –

関連する問題