2016-09-01 10 views
0

私はいくつかのアドバイスが必要な次の問題があります。プラグインインフラストラクチャにプロパティクラスを渡す

私は、標準のIPluginインタフェースストラテジによって定義された多数のプラグインを持つ構成を持っています。 これらのインターフェイスのそれぞれは、多数のカスタムクラスのプロパティを定義する多数の外部クラスにアクセスする必要があります。さらに、これらのクラスは多くのベースクラスから継承されています。

ここでの問題は、これらの構造に完全にアクセスするために、 の各プラグインにこれ​​らのプロパティクラスを提示する方法の設計の1つです。

いくつかのクラスを拡張するには、複数のリストがあります。議論のために、それぞれ30〜60のさまざまな財産のサブアイテム を持つリストを最大50個リストします。

私はもちろん、すべてのプロパティクラスを依存クラスとしてインターフェイスクラスに移動することができますが、これらのクラスのほとんどが継承されているので、それは大胆な解決策になります。 refオブジェクトとして渡すことも実行可能な解決策ではありません。

私はそれが助けになるとは思っていないので、私は特定のコードを含んでいませんが、ここでは私は を達成するために少しpsudoバージョンです。

public interface IPlugin 
{ 
ResultsList PluginProcess(Class1 L1, Class2 L2, ...); 

} 

クラス(n)は

public class Class1 : SomeOtherClass 
{ 
public object1 obj1 {get; set; } 
... 
public object50 obj50 { get; set;} 
} 

主他の派生オブジェクトで構成されてもよいです。私は

L1.classes.data[0].codec[2].enabled = true; 
and 
L2 newclass2 = new L2(); 
newclass2.nnnn ... 

ResultsList.classes.Add(newclass2); 

ようなコードを使用できるようにする必要があるプラグイン内

はFinaly Iは第partys、データのカスタム処理を提供するために、プラグインアーキテクチャを使用する必要があります。

建設的な提案を歓迎します。

答えて

0

私はDictionary<string, object>に基づいていると考えています。

その中にDictionaryすべてのクラスを有用な識別子で追加します。

dictionary["Class1"] = new Class1(...); 
dictionary["Class2"] = new Class2(...); 

次に、インターフェイスにDictionaryを渡します。

ResultsList PluginProcess(Dictionary<string, object> context); 

これにより、消費者に任意のデータを提供することができます。 APIドキュメントを使用して、各クラスを取得するために使用するKeyを記述することができます。これにより、時間の経過とともにインターフェイスの入力を柔軟に拡張できます。

これはおそらくこれをさらに進めて、プラグインコンテキストの特別なクラスを持つ価値があります。

class Context 
{ 
    public Dictionary<string, object> Values; 

    ... 
} 

次に、Contextオブジェクトをインターフェイスに渡すことができます。

ResultsList PluginProcess(Context context); 

これにより、時間の経過とともにインターフェイスの入力を増やす柔軟性が向上します。消費者を支援するために、Contextに追加の機能とデータを提供することもできます。

+0

私は辞書のインターフェースを見ましたが、プロパティ名と値にアクセスするのに多くの検索が必要となるため、検索時間にベンチマークによって置かれました。あなたの提案を受けて、もう一度見ていきます。私がオブジェクトを渡し、Visual Studioですべてのプロパティクラスがローカルにある場合、私はそのデータにアクセスするための簡単で巧妙な方法を望んでいました。ありがとう –

関連する問題