私はAsp.Net MVC 3の依存性注入にIoCコンテナを使用しています。アクションメソッド内でエンティティ/モデルオブジェクトを作成する最善の方法は何ですか?モデルは、コンストラクタ経由でコントローラに注入される特定のリポジトリまたはサービスから取得されることがありますが、システム内の他の多くのモデルオブジェクトではそうではありません。アクションメソッドのモデルオブジェクトを解決するためにIoCを使用する
答えて
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>
注入を処理することができるはずです。
通常のコンストラクタインジェクションを使用するだけではいかがですか? Func
私は同意する、理想的にはあなたが同意する。しかし、質問タイトルには「実際の目標を達成するためのよりよい方法があるとは思うが、IoCを使ってモデルオブジェクトを*アクションメソッドで解決する*」と書かれている。 –
現実世界の状況は、半ダースのアクションがあり、そのうちの1つだけが 'IFooService'を必要とし、' IFooService'の作成が高価な場合があります。このような状況では、アクションに 'IFooService'の解決を延期することができるので、それを必要としないアクションでは解決されません。つまり、おそらく 'IFooService'には次のような設計上の問題があります。 –
アクション引数を解決するためにDIコンテナを使用しません。これは、ASP.NET MVCでmodel binderが意図していることです。そして、あなたの行動は引数としてすべてのドメインモデルを取るべきである=>彼らはビューモデルだけを取るべきです。ビューモデルは、特定のビューの要件を満たすように特別に定義されたクラスです。
特定のケースでは、アクション引数のインスタンス化とバインドを担当するカスタムモデルバインダーを作成する可能性があります。モデルバインダー自体のインスタンス化に関しては、ASP.NET MVC 3ではdependency resolverを使用できます。これを使用すると、選択したDIフレームワークを使用してこのモデルバインダーに依存関係を注入できます。
モデルやビューモデルについては、投稿されたデータやパラメータについては言及していませんので、基本的なCRUDコントローラの 'Create'アクションメソッドのように、ビューに渡す必要があるデータをどのように生成しますか?したがって、Viewモデルは直接作成できますか? –
@Threecoins、私はあなたが何を求めているのか分かりません。ビューに渡すデータは、ビューモデルの形式で表示されます。ビューモデルは、このビューに必要な情報を定義して含めるクラスです。コントローラのアクションは、リポジトリにクエリしてドメインモデルを取得し、このドメインモデルをビューモデルにマップし、ビューモデルをビューに渡します。たぶんあなたの問題を少し詳しく説明できるコードを表示できますか? –
@DarinDimitrovこのようなモデルバインダーの実装が必要な場合は、Autofacと言うと、それはすばらしいでしょう。 –
- 1. これを解決するためにminヒープを使用する方法
- 2. 文法問題を解決するための実用的な解決策
- 3. ローカルで解決するためにIvyを使用する方法
- 4. 解決法を見つけるためにfsolveを使用する
- 5. RavenDBを使用するためにSimple Injector IoCを設定する方法
- 6. IoCフィールドを正しく理解するためにfindbugsを教えるには?
- 7. ユニットテストにIoCを使用する
- 8. IoCコンテナを使用してServiceクラスのServiceConfigを解決する適切な設計
- 9. 構造マップを使用してアプリケーションのコア内で一般的なルートを解決するIoC
- 10. 重複するキーを挿入するための解決策
- 11. パンダ:エンコードの問題を解決するために保存
- 12. C#解読するためにRSA解読を使用して
- 13. ASP.NET MVCアクションメソッドを使用する
- 14. Django Adminに時間の値を格納するために使用するモデルオブジェクトの種類は何ですか?
- 15. これを解決するためのより良い方法のためのジェネリックの使用
- 16. オペアンプの問題を解決するためにZ3 SMT-LIBをオンラインで使用する方法
- 17. .NETでホスト名を解決するために使用するDNSサーバーを指定します。
- 18. Pythonパッケージをインストールするために使用されたパッケージマネージャを決定する
- 19. Unity IoCでlog4netを使用する
- 20. 拡張メソッドでIoCを使用する
- 21. 城ウィンザーIocを解決一般的なクラスのweb.config
- 22. エンドユーザの問題を解決するためにアンドロイドアプリを導入する方法
- 23. Sassが@import文を解決するために使用するアルゴリズムとは何ですか?
- 24. "リンカエラー"を解決するための任意のアイデアundefiendリファレンス
- 25. 振り子運動のためのODEを解決するGSL
- 26. Java - アプリケーションの問題を解決するためのヘルプ
- 27. ゲームを解決するためのアルゴリズム「Pop it」以上のステップ
- 28. メモリの断片化を解決するためのヒープ分割
- 29. CastleでSystem.Web.Services.WebServiceインスタンスを解決する(AOPの目的のため)
- 30. この問題を解決するためにデザインパターンを使用できますか?
詳細をお知らせください。モデルオブジェクトの中には、リポジトリやサービスから来ていないものがある場合は、どこから来たのでしょうか? – MattDavey
実際にはいくつかのステップを持つコントローラがありますが、ほとんどの場合、すべてのアクションが異なるモデルで異なるビューを生成し、モデルを表示するように設定されています。 HtmlHelperは、データを受け入れるためのフォームを表示するための拡張メソッドを使用するモデルとして設定された空のオブジェクトを必要とし、このビューのviewmodelには、特定のエンティティタイプのプロパティ、たとえば 'SiteSettings'クラスがあります。私は、ViewModelとその依存関係をActionメソッド内から解決する方法がわかりません。 –
あなたが尋ねた元の質問は、あなたが求めようとしていたかもしれない質問とは異なると思います。この質問は、IOCコンテナを使用してアクション内のオブジェクトを解決する方法に関するものでした。実際の質問は、「ASP.NET MVCでウィザードを作成するにはどうすればよいですか?」というように聞こえます。そして、正しい答えは、アクションメソッド内でIOCコンテナを使用することを含むとは考えていません。新しい質問をすると、より良い解決策が得られるかもしれません。 –