2011-03-18 10 views
1

タスクを完了するために使用されたコンポーネントがCOMコンポーネントまたは.NETコンポーネントのいずれかである場合に、テストおよび拡張性のために設計する良い方法はありますか? COMコンポーネントを完全にラップしてインターフェイスを抽出するのは理にかなっていますか?ここで、「ABC」は、部品メーカーの頭文字であるCOMコンポーネントの簡単な、完全に不自然、RCWインターフェース、次のとおりです。COMオブジェクトでテスト可能なデザイン

public interface IComRobot 
{ 
    void abcInitialize(object o); 

    void abcSet(string s, object o); 

    void abcBuild(); 

    void abcExit(); 
} 

私には、コンポーネントのプロバイダは、すべてのメソッドの前に付けることを選んだという事実は、彼らの会社が多少刺激的であることを示すものがあります。問題は、私は同じアクションを実行する他のロボットコンポーネントを定義したいが、基本的な実装は異なっている。ロボットビルダーが "abcAnything"を実装しなければならないのは完全に混乱します。

このような単純な実装でRobotFactoryを構築するにはどうすればよいですか?

public class RobotFactory 
{ 
    public static IRobot Create(int i) 
    { 
     // // problem because ComRobot implements IComRobot not IRobot 
     if (i == 0) return new ComRobot(); 
     if (i == 1) return new AdvancedRobot(); 
     return new SimpleRobot();   
    } 
} 

私は弾丸をかむので、ロボットの実装を混乱させ、私のインタフェースにおけるABC接頭辞を受け入れるべきでしょうか?ロボットの消費者がCOMロボットをいつ使用しているかを知るように強制する必要がありますか?これらのどれも理想的ではありません。私は抽象化の追加レベルについて考えています(それはすべてを解決できますよね?)。そのような何か:私は、その後変更などのようなRobotFactoryを使用することになり

public interface IRobot : IDisposable 
{ 
    void Initialize(object o); 

    void Set(string s, object o); 

    void Build(); 

    void Exit(); 
} 

public class ComRobotWrapper: IRobot 
{ 
    private readonly IComRobot m_comRobot; 

    public ComRobotWrapper() 
    { 
     m_comRobot = ComRobotFactory.Create();  
    } 

    public void Initialize(object o) 
    { 
     m_comRobot.abcInitialize(o); 
    } 

    public void Set(string s, object o) 
    { 
     m_comRobot.abcSet(s, o); 
    } 

    public void Build() 
    { 
     m_comRobot.abcBuild(); 
    } 

    public void Exit() 
    { 
     m_comRobot.abcExit(); 
    } 


    public void Dispose() 
    { 
     //...RELEASE COM COMPONENT 
    } 
} 

public class ComRobotFactory 
{ 
    public static IComRobot Create() 
    { 
     return new ComRobot(); 
    } 
}  

public class RobotFactory 
{ 
    public static IRobot Create(int i) 
    { 
     if (i == 0) return new ComRobotWrapper(); 
     if (i == 1) return new AdvancedRobot(); 
     return new SimpleRobot();   
    } 
} 

public class Tester 
{ 
    // local vars loaded somehow 

    public void Test() 
    { 
     using (IRobot robot = RobotFactory.Create(0)) 
     { 
      robot.Initialize(m_configuration); 
      robot.Set(m_model, m_spec); 
      robot.Build(); 
      robot.Exit(); 
     } 
    } 
} 

私は、このアプローチの意見に興味があります。別のアプローチをお勧めしますか?私は本当にDIフレームワークを採用したくないので、それは範囲外です。落とし穴はテスト可能か?私はこの長い問題を検討する時間をとっていただきありがとうございます。

+0

私の意見では、 "インターフェイスの非abcプレフィックス"ソリューションは "アダプタ - 実装to com-インターフェイス"といいソリューションです。あなたは私がそれをしたように問題を解決しました。 – k3b

答えて

0

それは私にスポットに見えます。ドメイン/アプリケーションに適したインタフェースを作成し、それを第三者コンポーネントとして実装しています。

関連する問題