天真的程序集初始化是否有良好的模式?

时间:2011-08-05 12:49:00

标签: c# .net

假设我们有几个程序集,它们都实现了IAnimal,我们想去一个地方找出其他IAnimal实现的存在。

特点:

  • 我们不希望在集会之外进行预知识

  • 程序集中可能有一个注册类/方法

  • 使用反射最好。到目前为止,这似乎是唯一的方法

讨论:

我想通过继承静态地做这个,但是,我不知道汇编级初始化序列。

3 个答案:

答案 0 :(得分:6)

我建议看看MEF。它实际上是为这种东西而设计的。

它确实使用了反射,因为这是为这种动态发现创建的机制。我怀疑你会找到一个不使用某种程度反射的解决方案。

答案 1 :(得分:1)

我写了an extension method,它允许您查找在运行时符合某些条件的已部署类型 - 它确实使用了Reflection,但您可能会发现它很有用。

IEnumerable<Type> animalTypes = Assembly.GetExecutingAssembly()
    .GetAvailableTypes(
        typeFilter: t => !t.IsInterface && typeof(IAnimal).IsAssignableFrom(t));

答案 2 :(得分:1)

启动应用程序时,您可以注册到AppDomain的AssemblyLoad:

AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(NewAssemblyLoaded);

并定义NewAssemblyLoad以将IAnimal实现添加到您维护的类型列表(例如animalTypes)中:

static void NewAssemblyLoaded(object sender, AssemblyLoadEventArgs args)
{
    Assembly anAss = args.LoadedAssembly;
    foreach (Type t in Assembly.GetTypes())
    {
        if (!t.IsInterface && typeof(IAnimal).IsAssignableFrom(t))
            animalsList.Add(t);
    }
}