2017-08-21 12 views
2

私のアプリケーションを構造化する正しい方法に関する質問があります。私はC#の初心者ですので、根本的な欠落があれば申し訳ありません。 私はウェブ上で(stackoverflowだけでなく)見たが、何の答えも見つからなかったので、これはちょうど私が何か間違っているからです。C#構造体 - 外部ライブラリからのクラスへのアクセス

私のオブジェクトを定義するためのクラスがいくつかあるプロジェクトがあります。

Object1.class.cs

Object2.class.cs は...

は現在、いくつかの機能のために、私はコードをexternaliseするクラスライブラリ(.dllファイル)を作成しました。私がアップデートをする必要がある場合は、すべてのコードではなく.dllファイルを置き換えるだけです。

しかし、私はそのクラスにオブジェクトを送信したいときに問題を抱えていますが、解決策の外部にあるためだと思いますか?

私はそれを正しく行うかどうか疑問に思う。

1)プロジェクトから別に作成したクラスにオブジェクトを送信する方法はありますか?

2)この方法で作業することをおすすめしますか?もちろん、プロジェクトにライブラリを追加することもできますが、その場合は.dllファイルを分割しないで、すべて1つの.exeファイルに入れます。

3)私は自分のクラスをテストする必要があるとき、私はいつも私のプロジェクトを閉じてそれを編集するためにクラスを開いてから、私のプロジェクトに戻ってそれをテストする必要があります。それを行う簡単な方法はありますか?

事前に感謝あなたはシモーネCifaniがperfercly私の質問に答えた

編集2.

助言のために:

1)クラスは

2を外面化されなければならないが)必要なクラスへの参照を追加します。私の外部ライブラリの

3)メインプロジェクトの各クラスと外部ライブラリへの参照を追加します

私はインターフェイスを使用する方法がわからないので、私はそれなしでやりますが、私はすべてがうまくいかないと思います。

+0

あなたは「そのクラスにオブジェクトを送信」とは何を意味するのですか? –

+0

私のオブジェクトには、パラメータのリスト(int、string、List )... 今まで私が見つけた唯一の方法は、ライブラリの関数makeCalculous(string1、int1、int2 ...)を呼び出すことです。または3つのパラメータは問題ありませんでしたが、今ではそれらの数が多くなり始めているので(30)、string/intのリストではなく、オブジェクト全体を関数に渡す方が簡単です。 –

+0

あなたのコードを教えてください。具体的には、メソッドシグネチャとその呼び出し方法。 –

答えて

2

コードの一部を外部化する非常に一般的な方法は、インターフェイスを使用することです。

簡単な例は次のとおりです。

//CalculatorInterface.dll 
namespace Calculator.Interface 
{ 
    interface ICalculator 
    { 
     int DoCalculus(List<object> list); 
    } 
} 

//CalculatorImplementation_1.dll 
// Add a reference to CalculatorInterface.dll 
namespace Calculator.Implementation 
{ 
    using Calculator.Interface; 

    class CalculatorImplementation_1 : ICalculator 
    { 
     public int DoCalculus(List<object> list) 
     { 
      int result = 0; 

      foreach (Object obj in list) 
      { 
       if (obj is int) 
       { 
        result += (int)obj; 
       } 
      } 

      return result; 
     } 
    } 
} 

//Calculator.dll 
// Add a reference to CalculatorInterface.dll 
// Add a reference to CalculatorImplementation_1.dll (or dynamically load it) 
namespace Calculator 
{ 
    using Calculator.Interface; 
    using Calculator.Implementation; 

    class MyCalculator 
    { 
     void CalculateSomething() 
     { 
      List<Object> list = new List<Object>(); 
      list.Add(1); 
      list.Add(2); 
      list.Add("SomeString"); 

      ICalculator calculator = new CalculatorImplementation_1(); 

      int result = calculator.DoCalculus(list); 

      Console.Write(result); 
     } 
    } 
} 
+0

インターフェイスは使用しませんが、私があなたの提案(およびあなたのコメントの上)を理解していれば、私は3つの異なるプロジェクトを作ることができます。 そのような問題は、dllの1つを変更する必要があるたびに、プロジェクトの各フォルダにコピーする必要がありますか? たとえば、CalculatorInterface.dllで変更を加えた後、この.dllをCalculator.Implementationプロジェクトのあるフォルダにコピーしてからcalculator.dllプロジェクトフォルダにコピーする必要がありますか? もし私が必要なのは: 1)私のクラスを外部化して、その後、.dllファイルを作成 2)この.dllへの参照を使用するすべての.dllに追加します。 3)メインプロジェクト内のすべてのDLLへの参照を追加する –

+0

あなたの例ではインタフェースを使用している質問もありますが、私が理解した限りでは、インタフェースなしで行うことができます。インターフェイスを使用する利点は何ですか? その後、リストだけでなく、私の.dllオブジェクトを簡単に送受信することができると言って、あなたの私の質問に対するあなたのコメントについて? –

+0

インターフェイスを使用する利点は、実装を外部化し、メインプロジェクトで変更を加えずに変更できることです。インターフェースは契約と考えることができます。私の例では、3つの異なるプロジェクトを提案します。なぜなら、それはあなたのニーズに密着していると思ったからです。しかし、コードを構成する他の方法があります。実用的な側面に関しては、Visual Studioを使用している場合は、プロジェクトへの参照を追加するだけで済みます。次に、dllで何かを変更すると、それがコピーされます。明らかに、あなたの.dllに任意の種類のオブジェクトを送受信することができます。 –

関連する問題