设计c# Excel COM插件结构

本文关键字:插件 结构 COM Excel 设计 | 更新日期: 2023-09-27 17:50:00

我正在为Excel 2007+构建一个COM插件,它将是一个应用程序:

  • 它在Ribbon上有自己的选项卡,带有控制其操作的按钮(例如"创建新的规划工作簿"/"刷新工作簿"等)
  • 它将捕获来自Excel(应用程序和工作簿)的事件并对其进行处理。
  • 它应该有一个任务窗格,它将基于上下文,并将数据从我的插件发送到它。

为了支持这一点,我希望以这样一种方式构建代码,以便我可以在将来相对容易地修改它(例如,在Ribbon上添加一个新按钮),而不是到处都是意大利面。

我最初的想法是创建一个单例类,它将是我的"Addin Application",并使用Excel应用程序本身初始化它,例如:

public class Connect : Extensibility.IDTExtensibility2 {
    private Excel.Application _excelApplication;
    private MyAddinApplication _myAddinApplication;
    public void OnConnection(Object application,...) {
        _excelApplication = (Excel.Application)application;
        _myAddinApplication = new MyAddinApplication(_excelApplication);
    }
}
这个MyAddinApplication类会捕获Excel的事件(比如打开一个工作簿,关闭等),然后对它们采取相应的行动。它还将捕获任何Ribbon事件或回调,然后基于Command模式触发操作。

我的问题是,这是一个合理的方法为Excel COM插件?将Excel应用程序封装在由我的"插件应用程序"类引用的单独的"事件处理程序"类中会更好吗?在我的研究中,我还没有真正看到一个复杂的COM插件,只有那些有一个或两个按钮或不捕获任何事件的插件。

设计c# Excel COM插件结构

你可以看看这个(稍微复杂一点)Excel插件。作者描述了他如何将他的解决方案组织到不同的项目中,我同意他的大多数决定。他将域逻辑从用户界面/excel中分离出来,还添加了单元测试项目和一个引导整个插件的项目:

http://www.clear-lines.com/blog/post/VSTO-solution-organization.aspx

源代码在这里:http://vstostocks.codeplex.com/

这是一个VSTO解决方案,但您可以轻松地将相同的原则应用于普通的COM插件。它也很像你的项目。

如果不了解问题的细节,很难给出指导方针。我认为,如果你在面向对象设计(如SOLID)方面坚持主要准则,编写干净的代码,你应该会很好。