1

私は次のコードを書きましたが、それを改善しようとしています。Unity DI を使用して、具象クラスとそれらが実装するインターフェイスを登録する必要があります。この方法の利点は、追加された新しいクラスを登録し続ける必要がなくなることです。

私はコードを

    IUnityContainer コンテナー = 新しい UnityContainer();
            // から
            // 工場
            // container.RegisterType();

            // サービス
            // container.RegisterType();
            // container.RegisterType();
            //......
            // に

    var アセンブリ = AppDomain.CurrentDomain.GetAssemblies()
        .Where(x => x.GetName().Name.Contains("Romabravo.ApplicationManager"));

    foreach (アセンブリ内の var アセンブリ)
    {
        var タイプ = assembly.GetExportedTypes();
        foreach (型に t を入力)
        {
            var インターフェイス = t.GetInterfaces().Where(x => x.FullName != null &&
            x.FullName.Contains("Romabravo.ApplicationManager")).ToList();

                foreach (インターフェイスの var 項目)
                {
                    var interfaceImplementers = AppDomain.CurrentDomain.GetAssemblies()
                    .SelectMany(s => s.GetTypes())
                    .Where(p => item.GetTypeInfo().IsAssignableFrom(p) &&
                    item.FullName.Contains("Romabravo.ApplicationManager"))
                    .Select(x => x).Where(x => !x.IsInterface && !x.IsAbstract).ToList();

                    if (interfaceImplementers != null)
                    {
                        foreach (interfaceImplementers の var 実装者)
                        {
                            container.RegisterType(アイテム、実装者);
                        }
                    }
                }
            }
        }

    返却コンテナ;


さらに最適化する方法を探しているだけです。

4

1 に答える 1

2

Unity 3 を使用している場合は、コードを少し簡素化できる規約による登録を使用できます。

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies()
      .Where(a => a.FullName.Contains("Romabravo.ApplicationManager")),
    WithMappings.FromMatchingInterface);
于 2013-08-18T13:31:36.783 に答える