2016-03-29 1 views
0

大規模なインターフェイスとクライアントベースクラスをより小さなクラスに持つWCFサービス契約を分割する必要がありました。小規模なクラスはすべて類似していますが、異なる運用契約を持っています。下位互換性のために、すべての新しいサブクラスでオペレーションコントラクトメソッドを単一のクラスとして公開できるようにしたいと考えています。私はその後、それらのメソッドはMainClientで定義されているかのようにSub1Sub2からメソッドを呼び出すことができるようにしたいでしょう単一クラスとしてのプロパティのメソッド公開

public class MainClient { 

    public MainClient() { 
     Sub1 = new Sub1Client(); 
     Sub2 = new Sub2Client(); 
    } 

    public static Sub1Client Sub1; 
    public static Sub2Client Sub2; 
} 

:理想的には、次のようになります。だから(new MainClient()).Sub1.Method1()を呼び出すのではなく、(new MainClient()).Method1()と呼ばれ、Method1はまだSub1Clientクラスに存在します。

これは可能ですか?

+2

あなたはMainClientでメソッド1を宣言し、MainClient.Method1内Sub1.Method1への呼び出しである必要があります。 –

+0

ああ、それは理にかなっています。論理的には、それは悪夢です。私は500K +ラインの神クラスを探していますが、これはXMLシリアライズを合理的に速くするために〜2Kのオペレーション契約を持つ少なくとも45人のサブクライアントに分割する必要があります。すべての正規表現と祈りはここからです。 –

+0

Goodluckの兄弟。 :) –

答えて

1

I明確にあなたの質問を理解しますが、このsolutionをチェックしていることを確認していない:

public interface IFirst 
{ 
    void Method1(string a); 
} 

public interface ISecond 
{ 
    double Method2(int b, bool a); 
}  

public interface IComplex : IFirst, ISecond 
{ 
} 

public class MyException : Exception 
{ 
    public MyException(string message) : base(message) 
    { 
    } 
} 

public class Sub1Client : IFirst 
{ 
    public void Method1(string a) 
    { 
     Console.WriteLine("IFirst.Method1"); 
     Console.WriteLine(a); 
    } 
} 

public class Sub2Client : ISecond 
{ 
    public double Method2(int b, bool a) 
    { 
     Console.WriteLine("ISecond.Method2"); 
     return a ? b : -b; 
    } 
} 

public class MainClient : IComplex 
{ 
    public MainClient() 
    { 
     Sub1 = new Sub1Client(); 
     Sub2 = new Sub2Client(); 
    } 

    public static Sub1Client Sub1; 
    public static Sub2Client Sub2;   

    private T FindAndInvoke<T>(string methodName, params object[] args) 
    { 
     foreach(var field in this.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)) 
     { 
      var method = field.FieldType.GetMethod(methodName); 
      if(method != null) 
       return (T)method.Invoke(field.GetValue(this), args); 
     } 
     throw new MyException("Method was not found!"); 
    } 

    public void Method1(string a) 
    {    
     FindAndInvoke<object>(MethodBase.GetCurrentMethod().Name, a);    
    } 

    public double Method2(int b, bool a) 
    { 
     return FindAndInvoke<double>(MethodBase.GetCurrentMethod().Name, b, a); 
    } 
}  

public static void Main() 
{ 
    var test = new MainClient(); 
    test.Method1("test"); 
    Console.WriteLine(test.Method2(2, true)); 
} 
関連する問題