0

ASP.NET MVC4 アプリケーションがあり、IOC に Unity を使用しています。Unity.MVC4 および UnityConfiguration Nuget パッケージを使用して、登録を支援しています。

大量のインターフェイスとそれに関連するタイプを Unity コンテナーに自動的に登録する必要があります。これを行うために、ダミー インターフェイスを作成しました。すべての実際のインターフェイスが継承する IDependencyInjectionScanner。以下はそれを示すコードです。

public interface IDependencyInjectionScanner
{

}

public interface IChair : IDependencyInjectionScanner
{
    NumberOfLegs { get; set; }
}

public class Chair : IChair
{
    public NumberOfLegs { get; set; }
}

public interface ITable : IDependencyInjectionScanner
{
    NumberOfChairs { get; set; }
}

public class Table : ITable
{
    public NumberOfChairs { get; set; }
}

次に、UnityConfiguration を使用して、スキャナーを使用して登録をバインドしました。コントローラーでインターフェイスが正しく解決されています。以下は、バインディングの方法を示すコードです。

Scan(scan =>
        {
            scan.AssembliesInDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"));
            scan.With<FirstInterfaceConvention>();
            scan.Include(x => (x.GetInterface(typeof(IDependencyInjectionScanner).Name) != null));
            scan.ForRegistries();
        });

問題は、階層型ライフタイム マネージャーを使用してスキャナーで検出されたすべての型を登録したいのですが、これを行う方法を理解できることです。UnityConfiguration の GitHub ページhttps://github.com/thedersen/UnityConfigurationには、以下のコードでこれを実現できると記載されています。

Configure<IChair>().AsHierarchicalControlled();

ただし、スキャナーによってバインドされたインターフェイスごとにそれを行う必要がある場合、スキャナーは役に立ちません。

Register<IChair, Chair>().AsHierarchicalControlled();

誰かがこれに対する解決策を見つけるのを手伝ってくれませんか。

4

2 に答える 2

0

@TylerOhlsen が提案したように、Unity 3.0 の組み込みのRegistration by Convention 機能を使用しました。登録マッピングを追加する必要があり、階層的なライフタイム マネージャーを使用しています。以下はそのためのコードです

container.RegisterTypes(
      AllClasses.FromLoadedAssemblies().Where(
        t => t.GetInterface(typeof(IDependencyInjectionScanner).Name) != null),
      WithMappings.FromMatchingInterface,
      WithName.Default,
      WithLifetime.Hierarchical);

私を悩ませていることが 1 つあります。登録を見ると、4 つあります (上記のコード例に基づく)。椅子タイプの 2 つのタイプ マッピングとテーブル タイプの 2 つのタイプ マッピング。

私は2つのマッピングしか期待していなかったので、これがなぜなのか誰にも光を当てることができますか.

于 2013-09-07T19:24:11.723 に答える