17

使用新 Outlook VSTO C# 项目创建的这个AddIn 类具有一个Application属性,您可以使用该属性来访问 Outlook 文件夹和项目。问题是当您在 ThisAddIn 类中时可以轻松使用它,但从项目中的其他类无法轻松访问它。这是因为它是一个实例属性。

我想找到访问此属性在我的其他类中提供的相同功能的最佳方法,因此我提出了两种可能的解决方案,但我不知道其中哪一个(如果有的话)是好的。

假设我想获取默认收件箱文件夹。在 ThisAddIn 类中,我只需执行以下操作:

this.Application.Session.GetDefaultFolder(Outlook.olFolderInbox);

现在如何在这个类之外做同样的事情?

1.静态属性

首先,我可以向类添加一个静态属性ThisAddIn并将其设置为我想在其他类中公开的值。

public partial class ThisAddIn
{
    public Outlook.Application OutlookApp;

    void ThisAddIn_Startup(object sender, EventArgs e)
    {
        // init static variable value here
        OutlookApp = this.Application

        // initialize the rest of addin here
    }

    void InternalStartup()
    {
        this.Startup += this.ThisAddIn_Startup;
    }
}

这样,在我的任何其他课程中,我都可以执行以下操作:

ThisAddIn.OutlookApp.Session.GetDefaultFolder(Outlook.olFolderInbox);

2. 创建新的应用程序对象

我可以做的第二件事是在我使用它之前在我的其他类中初始化 Application 对象。但我不确定创建该类型的新对象是否不会创建 Outlook 的新实例。

class MyOtherClass
{
    public void MyMethod()
    {
        var app = new Outlook.Application();
        var folder = app.Session.GetDefaultFolder(Outlook.olFolderInbox);
    }
}

有没有人有任何建议哪种方法更好,如果你对这个问题有不同的解决方案,我也会很高兴。

4

2 回答 2

19

由于您可以拥有 ThisAddIn 的单个实例,因此您可以拥有一个静态变量来访问外部的应用程序表单...仅供参考,当您添加 Outlook-AddIn VSTO 项目时,ThisAddIn 的实例将可用作静态类Globals中的静态成员

于 2010-02-13T08:09:15.933 回答
0

实际上,将静态变量放在 ThisAddIn 中以便从您的代码中引用是一种不好的做法。

根据这个答案https://stackoverflow.com/a/46493968/2068626, Outlook Application 对象是一个单例,所以最好自己做第二个建议

var app = new Outlook.Application();

由于这是 Outlook VSTO 加载项,因此启动 Outlook 的风险为零,因为它根据定义将运行。如果您在另一个 Office 应用程序中使用此方法,则仅当Outlook 当前未运行时才启动 Outlook。

为了完整起见,所有其他共享模型都应使用依赖注入的形式,因此您的代码中没有强耦合。

使用这两种方法,您还可以更容易(可能)将代码和其他类重构到一个单独的库中,以便在您的 VSTO 项目甚至 Nuget 包中更轻松地重用。

于 2019-10-22T12:37:34.070 回答