2017-06-20 44 views
0

我目前正在为Excel编写VSTO,但这也适用于其他应用程序。该应用程序适用于多个站点,因此我正在编写核心逻辑和特定于站点的逻辑。我试图将所有特定于站点的逻辑保留在单个子文件夹中,以便在站点之间进行交换。c#如何使实例化更抽象?

VSTOs有一个叫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指的是这个类将需要引用站点特定的代码(或者至少使用该子文件夹的名称空间)。

周围唯一的方法,我能想到的,将是物理移动文件到子文件夹,但离开命名空间是。有没有更好的办法?我觉得我错过了一些东西。

+0

你有没有考虑使用(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)) – Aron

+0

@Aron,就像是在说“你有没有考虑过使用面向对象的编程” – user5226582

+0

@Aron你是什么意思?我的大部分逻辑都是基于SOLID的......呃,尽可能的坚持下去。 – ToshiBoy

回答

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(); 
    } 
} 
+1

对不起,我忘记用我给实例变量的名称替换它。相应地编辑我的答案。 –

+0

谢谢,它看起来像我之后,但有一个钩子在某处丢失。什么叫'SiteImportMethod'? – ToshiBoy

+0

'AddInUtilities.ImportData()'方法是从代码中的某个点调用的。我从一个网站特定的班级假设。这正是我试图用我的模拟课程展示的内容。所以不要打电话'SiteImportMethod'而是使用此代码的地方,你通常只需要调用ÀddInUtilities.ImportData' –