【问题标题】:ASP.Net designing data access layer for lesser known databasesASP.Net 为鲜为人知的数据库设计数据访问层
【发布时间】:2012-12-08 04:49:36
【问题描述】:

我们正在重构 ASP.Net Web 应用程序的整个代码库。几乎整个应用程序都在使用 c# 代码中的 sql 语句来查询数据库,并且类似的 sql 语句分散在整个代码库中。该应用程序正在使用 Mimer 数据库,该数据库不是常用的数据库。

对于这样的应用程序有什么好的重构计划,特别是对于数据访问层以删除重复代码以确保 DRY?

【问题讨论】:

    标签: asp.net data-access-layer


    【解决方案1】:

    在数据库实现上实现一个抽象层,这样您的应用程序调用像GetUser()UpdateWidget() 这样的方法,而不是IDbCommand.ExecuteReader() 和朋友。

    这些方法将存在于接口上,每个实体类型一个。

    IUserRepository
    IWidgetRepository
    

    每个数据库平台的每个接口都应该有一个实现者。

    MySqlUserRepository
    MySqlWidgetRepository
    
    MimerUserRepository
    MimerWidgetRepository
    

    然后创建一个工厂类,为相关数据库平台提供所请求实体类型的正确实现类的实例。

    工厂类应该在知道应用程序当前配置使用的数据库平台的情况下进行实例化。它应该使用这些信息来选择要实例化的类并在被询问时返回。

    class RepoFactory
    {
        string _platform;
        public RepoFactory(string platform) { this._platform = platform; }
    
        public IUserRepository GetUserRepository()
        {
            if (_platform == "mysql") return new MySqlUserRepository();
            if (_platform == "mimer") return new MimerUserRepository();
            throw new NotSupportedException(_platform);
        }
    
        public IWidgetRepository GetWidgetRepository() // ...
    }
    

    保留对 RepoFactory 的单个实例的引用,以便您只需从配置中设置一次。

    将所有特定于数据库平台的内容粘贴到实现类中,工作完成。 (您已经编写了 Mimer 所需的所有查询 - 您只需将它们从您的应用程序移植到这个新的数据层。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多