【发布时间】:2013-09-05 21:15:12
【问题描述】:
我们有一个工具可以为我们的 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>());
}
}
我们通常有一个用于数据访问目的的标准类:
public class OracleDataContext
{
public IEnumerable<object> ExecuteMethodCall(string methodName, IEnumerable<string> parameters)
{
Debug.WriteLine("OracleDataContext.ExecuteMethodCall");
return new List<object>();
}
}
现在我想为GeneratedSchemaContext 使用上面的DataContext。那么我该怎么做呢?该类本身无法实现 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();
- 有没有更优雅的方式来完成这项任务?您如何看待解决方案?
- 这仍然是适配器模式还是我误解了它?
【问题讨论】:
标签: c# design-patterns architecture adapter