2017-06-20 18 views
0

私は現在VSTO for Excelを作成していますが、これは他のアプリケーションにも当てはまります。アプリはいくつかのサイト用ですので、私はコアロジックとサイト固有のロジックを書いています。私はサイト間の交換を容易にするために、すべてのサイト固有のロジックを1つのサブフォルダに保存しようとしています。C#インスタンス化をより抽象化する方法

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はサイト固有のコードを参照する必要があります(または少なくともそのサブフォルダの名前空間を使用する必要があります)。

私が考えることができる唯一の方法は、ファイルを物理的にサブフォルダに移動することですが、名前空間をそのまま残しておくことです。より良い方法がありますか?私は何かが足りないと感じています。

+0

(https://en.wikipedia.org [SOLID設計原理を?]/wiki/SOLID_(オブジェクト指向設計)) – Aron

+0

@Aron「オブジェクト指向プログラミングの使用を検討しましたか?」 – user5226582

+0

@Aron何を意味していますか?私の論理の大半は、固体に基づいています。まあ、それを守ることができます。 – 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'を呼び出す場所でこのコードを使用してください。 –

関連する問題