c#如何使实例化更抽象?

时间:2017-06-20 08:47:16

标签: c# class abstraction

我目前正在为Excel编写VSTO,但这也适用于其他应用程序。该应用程序适用于多个站点,因此我正在编写核心逻辑和特定于站点的逻辑。我试图将所有特定于站点的逻辑保存在单个子文件夹中,以便在站点之间交换更容易。

VSTO有一个名为ThisAddIn.cs的班级。它实例化一个名为AddInUtilities的类。我看起来像这样:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : IAddInUtilities
{
    public void ImportData()
    {
        var activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
        if (activeWorksheet == null) return;

        var loadCsv = new CsvImporter();  
        if (loadCsv.IsNotCancelled) loadCsv.AndImportIndexDataInto(activeWorksheet);
    }
}

我的CsvImporter课程是特定于网站的。它基于一个抽象类,而后者又基于一个接口,允许我将导入器中核心逻辑的所有东西从特定于站点的子文件夹中移开。

我能解决的问题是如何实现我班级的实例化

var loadCsv = new CsvImporter();

抽象?我显然无法实例化接口或抽象类。我可以将此类移动到特定于站点的代码中,但是我的ThisAddIn.cs引用此类将需要引用特定于站点的代码(或者至少使用该子文件夹的命名空间)。

我能想到的唯一方法是将文件物理移动到子文件夹中,但保留命名空间。有没有更好的办法?我觉得我错过了什么。

1 个答案:

答案 0 :(得分:0)

我建议将loadCsv设为类属性,并从特定于站点的代码中推送所需的对象:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities : IAddInUtilities
{
    ICsvImporter CsvImporter = null;

    public void ImportData()
    {
        var activeWorksheet = Globals.ThisAddIn.Application.ActiveSheet as Excel.Worksheet;
        if (activeWorksheet == null) return;

        if (CsvImporter != null && CsvImporter.IsNotCancelled) 
        {
             CsvImporter.AndImportIndexDataInto(activeWorksheet);
        }
    }
}

public class SiteSpecificClass
{
    public void SiteImportMethod()
    {
        var addinUtility = new AddInUtilities();
        addinUtility.CsvImporter = new CsvImporter();
        addinUtility.ImportData();
    }
}
相关问题