2009-07-24 3 views
5

私はMVCプロジェクトのクロスカッティングの懸案事項を収容するために使用しているBaseControllerを持っています。asp.net mvc with ioc - > BaseControllerを使ってコンストラクタスープを避ける

public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration) 
     : base(locationService,userService, configuration) 

私は:

public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c) 

この副作用は、各派生コントローラのための私のコンストラクタは、パラメータで溢れているということです。

しかし、これは私のコントローラが3の依存関係を有することを意味しますコントローラを解決するためにIoC(Windsor)を使用しているので、コンストラクタの依存関係を削除し、パブリックプロパティを自動配線することができます。

依存関係のいくつかをマスキングする以外にこれをしない理由はありますか?

public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 

このアプローチは読みやすく、特定のコントローラに関連する依存関係を明確に示しています。

また、私はそれがすべて間違っているし、BaseControllerは十字切り取りサービスを格納する正しい場所ではありません。

感謝しています。

おかげで、私は考えることができる クリス

答えて

1

一つの理由は、慣例である - 必要に応じて多くの人々が非必要な依存関係とコンストラクタ・インジェクションとセッター・インジェクションを解釈します。これはちょうどコンベンションであり、この例では自動配線プロパティの使用を止めません。

依存性注入は仕事を簡素化することになっています(私はDIを使用する最も重要な理由ではないが、正当な理由だと思います)。別の「グローバル」サービスを追加する必要がある状況を考えてみましょう。あなたはあなたのプロジェクトのすべてのコントローラを通過し、コンストラクタを変更する必要があります。これは本当に悪いことです。

この問題を解決する別のアイデアがありました。すべての「グローバル」依存関係を保存し、コンクリートコントローラに渡し、次に必要な依存関係を取得するベースに渡すコレクタオブジェクトを作成しました。それは依存関係を追加することで問題を解決し、具体的なコントローラが依存関係を基底クラスに渡していることを明確に述べるでしょう。私はそれを好きではなかった、なぜなら、新しい "グローバル"依存関係を追加するときには、2つのクラス( "依存関係コレクター"とBaseController)を変更する必要があるからです。

+0

私はあなたのアプローチがかなり好きです。一つの依存関係を持つことは、魔法が起こっていないことを明確にしています。 – Chris

関連する問題