2011-03-18 43 views
1

當用於完成任務的組件可以是COM組件或.NET組件時,設計測試和可擴展性的好方法是什麼?完全包裝COM組件並提取接口是否有意義?下面是一個簡單的,完全做作,RCW的COM組件,其中,「ABC」是組件製造商的縮寫接口:COM對象的可測試設計

public interface IComRobot 
{ 
    void abcInitialize(object o); 

    void abcSet(string s, object o); 

    void abcBuild(); 

    void abcExit(); 
} 

對我來說,出零件的供應商選擇前綴的所有方法有些事情表明他們的公司有點令人煩惱。問題是,我想定義執行相同動作的其他Robot組件,但底層實現是不同的。機器人制造商必須實施「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機器人?這些都不是理想的。我在考慮更多抽象層次(可以解決所有問題,對吧?)。事情是這樣:

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(); 
    } 
}  

然後我會改變,並使用RobotFactory像這樣:

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

在我看來,你的「非接口前綴接口」解決方案與「適配器實現COM接口」是一個很好的解決方案。你已經解決了問題的方式,我會做到這一點。 – k3b 2011-03-18 16:17:07

回答

0

這看起來很適合我。您正在創建一個適合您的域/應用程序的接口,並根據第三方組件來實現它。