一旦加载插件的问题得到解决(在 .NET 中通过 MEF 的情况下),下一步要解决的是与它们的通信。简单的方法是实现一个接口,使用插件实现,但有时插件只需要扩展应用程序的工作方式,可能会有很多扩展点。
我的问题是关于如何处理这些扩展点。我已经看到了不同的方法,但我不确定每种方法的优缺点,以及是否有更多更好的方法来实现这一点:
- 事件:将静态事件添加到我们想要“可扩展”的所有内容中。例如,如果我想为 User 类添加自定义验证,我可以添加一个 OnValidation 静态事件处理程序,并在构造它时从插件向它添加事件。
- 消息:有总线和消息。该插件可以订阅特定消息并在其他一些类发布该消息时执行某些操作。该消息应包含插件可以工作的上下文。在验证的情况下,逻辑层会发布一条 UserValidation 消息,插件会在收到消息时采取行动。
- 接口:宿主应用程序负责调用所有实现特定接口的插件,并为它们提供当前操作的上下文。在验证的情况下,插件可以使用 Validate(object context) 方法实现 IValidator 或 IUserValidator。
您曾经使用过其中一种公开的方法吗?哪一个最适合您?
在您问之前,我们的应用程序是一个可扩展的核心(用户、角色和内容管理),可在此基础上构建我们客户特定的以内容为中心的 Web 应用程序。一切都建立在 ASP.NET MVC 之上。