2013-09-05 23 views
1

我們有一個工具可以爲Oracle數據庫中的存儲過程生成映射代碼。 我會盡量把它解釋得儘可能抽象,沒有任何噪音,因此一切都被大大簡化了。適配器模式的使用,如果它是正確的

比方說,這是我們生成的代碼的一部分:

public interface IDbMethodCaller 
{ 
    IEnumerable<object> ExecuteMethodCall(string methodName, IEnumerable<string> parameters); 
} 

public class GeneratedSchemaContext 
{ 
    private readonly IDbMethodCaller _dbMethodCaller; 

    public GeneratedSchemaContext(IDbMethodCaller dbMethodCaller) 
    { 
     _dbMethodCaller = dbMethodCaller; 
    } 

    public IEnumerable<object> ExecuteSampleProcedure() 
    { 
     return _dbMethodCaller.ExecuteMethodCall("sample_procedure", new List<string>()); 
    } 
} 

我們normaly有我們使用的數據訪問的目的,一個標準類:

public class OracleDataContext 
{ 
    public IEnumerable<object> ExecuteMethodCall(string methodName, IEnumerable<string> parameters) 
    { 
     Debug.WriteLine("OracleDataContext.ExecuteMethodCall"); 

     return new List<object>(); 
    } 
} 

現在我想用上述DataContext爲GeneratedSchemaContext。那麼,我該如何做到這一點?該類本身無法實現IDbMethodCaller,因爲在其他項目中它不知道接口(生成的代碼的一部分)。

我想到了適配器模式,改變了一點點:

public class OracleDataContextAdapter : OracleDataContext, IDbMethodCaller 
{ 
    public new IEnumerable<object> ExecuteMethodCall(string methodName, IEnumerable<string> parameters) 
    { 
     Debug.WriteLine("OracleDataContextAdapter.ExecuteMethodCall"); 

     return base.ExecuteMethodCall(methodName, parameters); 
    } 
} 

所以,現在我可以做到以下幾點:

var db = new GeneratedSchemaContext(new OracleDataContextAdapter()); 
var result = db.ExecuteSampleProcedure(); 
  1. 是否有實現這一目標更優雅的方式任務?您如何看待解決方案?
  2. 這仍然是適配器模式還是我誤解了它?

回答

0

更簡潔清晰的解決方案是使用實現IDbMethodCaller與OracleDataContext的構造器注入。這樣你就不需要使用新的方法修飾符:

public class OracleDataContextAdapter : IDbMethodCaller 
{ 


    private OracleDataContext dataContext; 

    public OracleDataContextAdapter(OracleDataContext oracleContext) 
    { 

     this.dataContext = oracleContext; 
    } 

    public new IEnumerable<object> ExecuteMethodCall(string methodName, IEnumerable<string> parameters) 
    { 
     Debug.WriteLine("OracleDataContextAdapter.ExecuteMethodCall"); 

     return this.dataContext.ExecuteMethodCall(methodName, parameters); 
    } 
} 
+0

DIP!是的,我沒有看到。謝謝。你能說一些關於Adapter模式的東西嗎?這是一種適應性,我可以這樣稱呼班級嗎?用「適配器」後綴? – timmkrause