我们正在重构 ASP.Net Web 应用程序的整个代码库。几乎整个应用程序都在使用 c# 代码中的 sql 语句来查询数据库,并且类似的 sql 语句分散在整个代码库中。该应用程序正在使用 Mimer 数据库,该数据库不是常用的数据库。
对于这样的应用程序,特别是对于数据访问层以删除确保 DRY 的重复代码,什么可能是一个好的重构计划?
我们正在重构 ASP.Net Web 应用程序的整个代码库。几乎整个应用程序都在使用 c# 代码中的 sql 语句来查询数据库,并且类似的 sql 语句分散在整个代码库中。该应用程序正在使用 Mimer 数据库,该数据库不是常用的数据库。
对于这样的应用程序,特别是对于数据访问层以删除确保 DRY 的重复代码,什么可能是一个好的重构计划?
在数据库实现上实现一个抽象层,这样您的应用程序调用方法 like GetUser()
andUpdateWidget()
而不是IDbCommand.ExecuteReader()
and friends。
这些方法将存在于接口上,每个实体类型一个。
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 所需的所有查询 - 您只需将它们从您的应用程序移植到这个新的数据层。)