如何在尚未加载Unity的程序集中注册类型?

时间:2011-10-12 16:16:29

标签: unity-container assembly-loading

我想加载所有类型的接口,以便我可以在其上调用方法。但是,程序集未引用编译时。它们将位于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()。我希望这一点尽可能的动态。如果可能的话,我不必在配置文件或代码中指定程序集名称。

提前致谢。

1 个答案:

答案 0 :(得分: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更多是围绕内部依赖管理而构建的。