2017-04-27 7 views
0

通常、アクションメソッドは、このようなもので終了します:依存関係をモデルに挿入するにはどうすればよいですか?

return View(new Model()); 

しかし、私のモデルが注入されたサービスを持っているとしている場合、それはデフォルトのctorのを持っていません。ばかげ取得するために開始し

return View(new Model(new Service(new Repository()))); 

...:サービスは、それがよりこのようになると思い依存関係を持っている場合

return View(new Model(new Service()); 

をしかし:だから、それはこのように見ているでしょう。これはIoCコンテナのためのものではありませんか?

return View(container.Resolve<IModel>()); 

が、 containerを得るために、それは私のコントローラに注入しなければならないであろう、と私は injecting the container itself is an anti-patternことを聞く:だから私はもっとこのような何かを書くために誘惑されると思います。

だから正しい方法はありますか?アクションメソッドからビューを返すときに、依存関係をモデルに渡すにはどうすればよいですか?

答えて

0

私はブートストラップコードで初期化された静的コンテナオブジェクトを使用しましたが、時にはコンテナをパラメータに渡さなければなりませんでした。いくつかのコードは臭いがありますが、多くの依存関係を持つ手続きを想像してください。しかし、MVCでDIを使用すると、コンテナが自動的に注入され、それが私が見るパターンです(Autofac MVCを参照)。

1

しかし、私のモデルは、サービスを持っているとしている場合は、最初の場所で依存関係を持っていることから、あなたのビューモデルをさせる

防止を注入しました。ビューモデルはダムのデータコンテナでなければならず、コントローラのアクションが返ったときにモデルを完全に構築する必要があります。これにより、ビューとモデルが単純化され、状況が完全に防止されます。

しかし、本当に依存関係をビューモデルに渡したい場合は、依存関係の依存関係を渡す必要はありません。依存関係を渡すだけで、コントローラはアプリケーションコンポーネントなので、その依存関係はそのコンストラクタに注入されます。以下のように、それは一般的になります。

public class HomeController : Controller 
{ 
    private readonly IService service; 

    public HomeController(IService service) 
    { 
     this.service = service; 
    } 

    public ViewResult Index() 
    { 
     return View(new Model(this.service)); 
    } 
} 

ServiceがビルドアップされますRepositoryを使用することを意味)その依存関係を持つDIコンテナによってHomeControllerがされるビルドアップするので、あなただけのservice依存関係に渡すことができますその依存関係について何も知る必要はありません。

と私は容器自体を注入することが反パターンであると聞いています。

これは正しいです。 Composition Root以外のContainerを使用することは悪い考えです。

1

あなたは正しいです。依存関係注入を適切に行うと、コードがきれいになりますが、注入と初期化を行う複雑なコードが追加されます。そこにDIフレームワークが導入されています。彼らの主な目的は、あなたのような状況を正確に処理することです。コンテナに沿って渡す必要なく、複雑なコンストラクタの注入コードを削除します。NinjectのようなDIフレームワークでは、あなたのコードは次のようになります。

IKernel kernel = new StandardKernel(); 
Bind<View>(); 
Bind<Model>(); 
Bind<Service>(); 
Bind<Repository>(); 
var view = kernel.Get<View>(); 

手動で行うだろうとDIフレームワークがどうなるのかは、これら2件の記事に示されているものとのコントラスト:

ところで、他の多くの良いDIフレームワークがあります。あなたはNinjectを取る必要はありません、それらのすべての基本的な考え方は同じです。

関連する問題