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