【问题标题】:Usage of the Adapter pattern and if it is correct适配器模式的使用以及是否正确
【发布时间】: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();
  1. 有没有更优雅的方式来完成这项任务?您如何看待解决方案?
  2. 这仍然是适配器模式还是我误解了它?

【问题讨论】:

    标签: c# design-patterns architecture adapter


    【解决方案1】:

    更简洁、更优雅的解决方案是使用带有 OracleDataContext 的构造函数注入的 IDbMethodCaller。这样你就不需要使用 new 方法修饰符了:

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

    【讨论】:

    • 浸!是的,我没看到。谢谢你。你能谈谈适配器模式的事情吗?这是一种适应吗?我可以这样称呼课程吗?带有“适配器”后缀?
    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多