装饰.NET程序集

3
这可能有些困难,但.NET的灵活性从未停止过惊叹,所以我们来看看。
我正在开发一个MVC应用程序,需要搜索一组程序集中基于共同基类派生的类类型。
例如,我有几个程序集,它们具有各种派生自ActivityBase的活动类型。这些程序集将放置在特定目录中,有点像插件。由于它们需要在运行时动态加载,因此还需要一些依赖项(除非我能找到一个方便的方法来将它们分开,否则请随时提出建议)。
我编写了代码来遍历此目录中所有.DLL文件,加载程序集,并遍历程序集中的所有类型以查找派生自ActivityBase的类。
这很好用。然而,我想避免加载和搜索没有活动的程序集,因为其中一些依赖项具有数千个类型,这会导致性能问题。
那么,我的问题是,有没有除文件命名约定之外的装饰程序集的方法,可以指示它是活动程序集,并且在构建时很容易自动化且在运行时易于读取?
欢迎提出任何其他处理此问题的建议。

2
关于自定义程序集属性,你可以参考这个链接:https://dev59.com/RHI-5IYBdhLWcg3wR2Jr - nemesv
1
一个替代方案(因为它本身使用了大量属性)是Microsoft Extensibility Framework - MEF使您能够获取特定类型/实现的程序集。 - keenthinker
谢谢你提供的建议,虽然我不确定MEF是否能帮助我的整体应用设计,但我会进一步了解它。 - Gerald
1个回答

7
您可以实现自己的程序集属性:
[AttributeUsage(AttributeTargets.Assembly)]
public class ActivityAssemblyAttribute : Attribute
{
}

然后将必要的组件用这个属性装饰:
[assembly: ActivityAssemblyAttribute()]

如果需要,只需检查涉及的程序集是否使用了这个标记:

ActivityAssemblyAttribute attribute = null;
object[] attributes = assembly.GetCustomAttributes(typeof(ActivityAssemblyAttribute), false);
if (attributes.Length > 0)
{
   attribute = attributes[0] as ActivityAssemblyAttribute;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接