一旦解决了加载插件的问题(在.NET中通过MEF出现的情况),下一步要解决的就是与它们的通信。简单的方法是实现一个接口并使用插件实现,但有时插件只需要扩展应用程序的工作方式,并且可能有很多扩展点。扩展/插件通信的体系结构
我的问题是关于如何处理该扩展点。我见过这样做,不同的方式,但我不知道每个人的优点和缺点,如果有更多更好的方式来做到这一点:
- 活动:添加静态事件,所有的东西我们想让“可扩展”。例如,如果我想为User类添加自定义验证,则可以添加一个OnValidation静态事件处理程序,并在构建时从该插件向它添加事件。
- 信息:有一个公共汽车和一条消息。插件可以订阅特定的消息,并在其他类发布该消息时进行操作。消息应该包含插件可以工作的上下文。在验证情况下,逻辑层将发布UserValidation消息,并且插件将在接收到消息时采取行动。
- 接口:主机应用程序负责调用实现某些接口的所有插件,并为它们提供当前操作的上下文。在验证的情况下,插件可以使用Validate(对象上下文)方法实现IValidator或IUserValidator。
你曾经使用过某种暴露的方法吗?哪一个最适合你?
在您提出问题之前,我们的应用程序是一个可扩展的核心(用户,rola和内容管理),用于构建以客户端为中心的Web应用程序。构建在ASP.NET MVC上的所有东西。
接口可能是我的方法,虽然它取决于应用程序和它的插件需求。 但是这是一个非常干净的插件方法,并且也很容易从插件中分离出异常。 – 2009-11-18 12:53:23