0

ASP.NET MVCを使ってWebプロジェクトを開発しているうちに、私は結合問題に挑戦しました。 カスタムコントローラファクトリ(またはMVC 3を使用している場合は依存関係リゾルバ)をビルドするとき、どこから依存関係を取得するかを知るためにこのファクトリが必要です。ここに私のコードは次のとおりです。Structure Map依存関係リゾルバをASP.NET MVC Webプロジェクトから正しく切り離すにはどうすればいいですか?

//from Global.asax.cs 

DependencyResolver.SetResolver(new StructureMapControllerFactory()); 
class StructureMapControllerFactory: IDependencyResolver { 
    Container repositories; 

    public StructureMapControllerFactory() 
    { 
     repositories = new RepositoriesContainer(); 
    } 
    //... rest of the implementation 
} 
class RepositoriesContainer: Container 
{ 
    public RepositoriesContainer() 
    { 
     For<IAccountRepository>().Use<SqlAccountRepository>(); 
     //... 
    } 
} 

StructureMapControllerFactoryクラスはコントローラに依存性を注入するための責任があります。私が言ったように、これらの依存関係を見つける場所を知る必要があります(サービスやリポジトリの実装などの具体的なクラスを意味します)。

私はMySite.Dataという別のクラスライブラリを持っています。ここにはすべての実装の詳細があります。 IAccountRepositoryのような契約は、図書館MySite.Contractsに住んでいます。今、このMySite.DataライブラリをMVCプロジェクトから直接参照すると、自分のサイトとそのデータ取得の実装との間に依存関係が存在します。問題はどうすれば削除できますか?この場合のベストプラクティスは何ですか?

回避策がたくさんあると確信していますが、まだ見つからないだけです。

+1

削除する正確な**依存関係を明らかにすることはできますか?何と何の間? –

答えて

3

私が見るとおり、あなたはそれを正確に行うことはできません。あなたのMVCプロジェクトは実際に、それが使用する具体的なクラスについて知る必要があります。

あなたはこれらのコンテナ登録をどこかに提供する必要があり、そのタイプが定義されているプロジェクト/アセンブリへの依存関係を取得します。まもなく、MVCプロジェクトからMySite.Dataを参照する必要があります。そのような:

  • MySite.Dataは、MVCプロジェクトについて何も知らない
  • MVCプロジェクトは正しいコンテナの登録を提供するために、具体的なリポジトリの種類を知っています。

StructureMap Registryオブジェクトを使用すると簡単に作業を進めることができますが、それらのレジストリもどこかに含める必要があります。通常、これらはメインプロジェクトまたは「StructureMap-adapter」プロジェクトにありますが、いずれにしても参照を作成する必要があります。あなただけのControllersにDIのためにそれを使用する場合

  • 使用MVC3とカスタムIControllerFactoryをドロップ:

    私はあなたがすることをお勧めします。

  • オブジェクトは、これまで必要なすべてのIoC登録を提供するために、StructureMap Registryオブジェクトを使用します。
  • コンポーネント探索を提供するために、StructureMapアセンブリスキャン機能を使用します。
  • DependencyResolverとしてより一般的なものを使用してください。つまり、StructureMapControllerFactoryではなく、CommonServiceLocatorStructureMap adapterの代わりに使用してください。
  • メインアプリ内でStructureMap自体を抽象化してみてください。

もちろん、メインプロジェクト内の参照を恐れてはいけません。カップリングについては何も持っていません。メンテナンス性は低下しません。しかし、アーキテクチャが間違っているので、単純な参照ではなく、そのことを心配してください。

関連する問題