我们正在重构ASP.Net web应用程序的整个代码库。几乎整个应用程序都在使用c#代码中的SQL语句来查询数据库,类似的sql语句分散在整个代码库中。应用程序正在使用不是常用数据库的Mimer数据库。
对于这样的应用程序,有什么好的重构计划,特别是对于数据访问层,以便删除确保DRY的重复代码?
发布于 2012-12-21 00:21:34
在数据库实现之上实现一层抽象层,这样您的应用程序就可以调用GetUser()和UpdateWidget()等方法,而不是调用IDbCommand.ExecuteReader()和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编写了所有需要的查询-您只需要将它们从您的应用程序移植到这个新的数据层。)
https://stackoverflow.com/questions/13976033
复制相似问题