0

インターフェイスのすべてのタイプをロードして、メソッドを呼び出すことができるようにします。ただし、アセンブリはコンパイル時に参照されません。それらはbinフォルダーにあります。

これはUnityで簡単にできることですか?

たとえば、次のようなコードがあります。

using (var container = new UnityContainer())
        {
            container.RegisterType<IModule>();

            var modules = container.ResolveAll(typeof(IModule));

            foreach (IModule module in modules) { module.Logon(); }

            Console.WriteLine("Done...");
            Console.ReadLine();
        }

もちろん、アセンブリは bin フォルダーにドロップされたばかりなので、モジュールは何も解決されません。現在のアセンブリでは静的に参照されていません。

または、何らかの種類の Assemblies.LoadAssembly() を実行する必要がありますか。これをできるだけ動的にしたいと思います。可能であれば、構成ファイルまたはコードでアセンブリ名を指定する必要はありません。

前もって感謝します。

4

1 に答える 1

3

Unity 自体はアセンブリをロードしません。Type オブジェクトで動作し、CLR が必要に応じてそれらの型をロードできるようにします。

必要に応じて動的検出を行うには、bin ディレクトリ内のアセンブリをスピンスルーし、それらをメモリにロードしてから、関心のある型を探してスピンスルーするための小さなコードを記述する必要があります。リフレクション API に精通している場合。

bin ディレクトリをループして、そこにあるすべてのアセンブリが読み込まれていることを確認するために使用できるコードを次に示します。

    private static bool ForceLoadAssemblies()
    {
        foreach (var fileName in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
        {
            string assemblyName = Path.GetFileNameWithoutExtension(fileName);
            if (assemblyName != null)
            {
                Assembly.Load(assemblyName);
            }
        }
        return true;
    }

別のオプションは、代わりに MEF を調べることです。MEF は動的な検出ケース向けに明確に設計されていますが、Unity は内部の依存関係管理を中心に構築されています。

于 2011-10-12T22:17:10.567 に答える