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 回答