1

私は、プロジェクト内で構造マップとAsp .Net MVCを使用しています。現時点では、MVCレイヤーの下にあるすべてのもの(サービス、データなど)の依存関係の解決方法を登録しています。しかし、MVCレイヤのすぐ下にあるもの、つまりサービスレイヤを登録するだけで、これをどうやって行うことができるのだろうかと思っていました。基本的に私のコントローラにはサービスが注入されています。それは私のUIレイヤに知って欲しいことです。サービスクラスの中で私はリポジトリを注入し、そこにstructuremapで登録されたリポジトリを必要とします。言い換えれば、各レイヤーはそのレイヤーのすぐ下のレイヤーにのみ(できるだけ)依存させたいと思っています。 ありがとう!構造マップasp .net mvc登録

答えて

1

あなたが何を求めているのか分かりません。

解決されるすべてのオブジェクトを登録する必要があります。その後、あなたのコントローラでは、ISomeServiceがコンストラクタに渡されると考えています。コントローラは、例えばISomeServiceがIRepositoriesを注入したことを知らない。

1

良いアプローチは、構造マップの慣習と構造マップのレジストリを組み合わせて使用​​することです。それはあなたの登録問題の大部分を担当します。 Structuremapはあなたのビンをスキャンし、あなたのビン内のすべてのdllにある依存関係をマップすることができます。

Scan(x => 
{ 
    x.AssembliesFromApplicationBaseDirectory(y => 
     y.FullName.StartsWith("JustLookAtTheseDlls")); 

    // Use default conventions 
    x.WithDefaultConventions().OnAddedPluginTypes(y => 
     y.HybridHttpOrThreadLocalScoped()); 

    //Are there any registries? If so, register them 
    x.LookForRegistries(); 
} 

レジストリはこのような何かを見て、あなただけの各項目を登録するには、プロジェクトのそれぞれに1をドロップすることができます:

のStructureMapレジストリクラスと組み合わせScanメソッドへ

ルック

public class IocRegistry : 
    StructureMap.Configuration.DSL.Registry 
{ 
    public IocRegistry() 
    { 
     For<IDocumentStore>().Singleton() 
      .Use<RavenStore>(); 
    } 
} 

ルートアプリケーションには、上記のスキャンステートメントを含むレジストリが必要です。

MyTopLevelRegistryはこのようになります
ObjectFactory.Configure(x => x.AddRegistry(
    new MyTopLevelRegistry())); 

:あなたがいなくてもやるので、「WithDefaultConventions」は、それが自動的にMyClassのにIMyClassをマップするためにそれを設定している場合に注意してください

public class MyTopLevelRegistry: Registry 
{ 
    public MyTopLevelRegistry() 
    { 
     Scan(x => 
     { 
      x.AssembliesFromApplicationBaseDirectory(
       y => y.FullName 
       .StartsWith("InsertYourNamespacePrefix")); 

      x.WithDefaultConventions().OnAddedPluginTypes(
       y => y.HybridHttpOrThreadLocalScoped()); 

      x.LookForRegistries(); 
     }); 
    } 
} 

そして、そのようのStructureMapを初期化しますレジストリにそのようなものを指定する必要があります。その慣習に従わない品目を登録するだけです。

希望すると便利です。

2

composition rootの使用をお勧めします。

プロジェクトでは、StructureMapレジストリをxx.yy.IoCという名前のライブラリに配置し、Global.asaxから構成コードを呼び出します。

MVCレイヤには、IoCライブラリへのリンクのみがあります。 IoCライブラリは他のレイヤ(ドメイン、データなど)との依存関係を持っています

ヒント:この記事ではレイヤリングについての見解が変更されました。 jeffrey palermo onion architecture