适配器模式的使用以及是否正确

时间:2013-09-05 13:02:36

标签: c# design-patterns architecture adapter

我们有一个工具可以为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();
  1. 有更优雅的方式来完成这项任务吗?您对该解决方案有何看法?
  2. 这仍然是适配器模式还是我误解了它?

1 个答案:

答案 0 :(得分:0)

更清洁,更有争议的更优雅的解决方案是使用实现IDbMethodCaller和constrcutor注入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);
    }
}