2011-12-15 18 views
3

私は現在、MVC3を使用するWebアプリケーションを開発中です。 MVC3プロジェクトはサービスレイヤーを介してアプリケーションロジックにアクセスします。サービス層は、UnitOfWorkパターンでアクセスされるリポジトリを使用してデータベースにアクセスします。コントローラに注入されるサービスクラスの依存性注入

MVC3プロジェクトにサービスを注入するためにStructureMapをインストールしました。例コントローラは今、この

public class AccountManagementController : Controller 
{ 
    IAccountService accountService; 

    public AccountManagementController(IAccountService accountService) 
    { 
     this.accountService = accountService; 
    } 

ようになり、私の問題は私のAccountServiceのクラスは構造マップは、それを作成する際のUnitOfWorkが注入持っている必要があるということです。現在私は2つのコントローラを持ってこれを処理します。 1つはインターフェースを取り、もう1つは具体的なクラスをインスタンス化します。

public class AccountService : IAccountService, IDisposable 
{ 
    private IUnitOfWork unitOfWork; 

    internal AccountService(IUnitOfWork unitOfWork) 
    { 
     this.unitOfWork = unitOfWork; 
    } 
    public AccountService() 
    { 
     this.unitOfWork = new UnitOfWork(); 
    } 

これはコードの匂いのようです。これを処理するより正しい方法がありますか?

おかげで、 AFrieze

+4

デフォルトのコンストラクタを削除します... –

+0

私は、StructureMapを構成するための流暢なインターフェイスが何年も変わったと思いますので、どんなコードがどのバージョンで動作するか分かりません。しかし、必要に応じてブートストラップコードに特定の 'IUnitOfWork'実装を使用するよう指示することができます。ここを見てください:http://stackoverflow.com/q/289512/328193 – David

+0

ありがとう、私は見てみましょう。これは私が一般的に避けようとしている私のウェブサイトからの私のDALへの参照を必要とするでしょう。 – AFrieze

答えて

1

にAccountServiceのの依存関係を解決できるようにするために、依存関係をカスケード接続することができますが、...

必要がありますAFAIK、StructureMapは、ほとんどの引数を持つコンストラクタを常に選択します。したがって、IUnitOfWorkの依存関係を解決する際には問題ではありません。

一方、IDisposableは私には匂いのようです。そのような使い捨てのインスタンスに対処する方法を私の知る限りのStructureMapのアドバイスは:

  • 我々は使い捨てでない ラッパーに使い捨てのサービスをラップする必要があります。使い捨てではないラッパーは、インスタンス wrappsを破棄する必要があります。
  • 私たちは使い捨てサービスの工場を非使い捨てラッパーに注入する必要があります。

これらの2つのケースでは、使い捨てサービスを直接注入するラッパー装置を消費者に注入する。

structureMapでは、使い捨てのインスタンスを追跡するネストされたコンテナ機能を利用することもできます。したがって、入れ子にされたコンテナが配置されると、すべてのオブジェクトグラフが解放されます。

1

私は、限り何も匂いはありませんコメントを示唆のように、あなたはAccountServiceのから、デフォルトのパラメータなしのコンストラクタを削除します。まともなIoCコンテナを使用すると、AccountManagementControllerにIAccountServiceを注入する際のマークは、私はデフォルトのコンストラクタを削除します示唆したように、それはIUnitOfWork