数据访问层目前是3个功能的重复:创建,获取,设置 在一些Dlo类型:Foo, Bar ,FooBar 其中Foo和FooBar具有相同的实现,而Bar具有更复杂的实现。
public static bool CreateFooBar(FooBarDlo newFooBar)
{
bool result = false;
using (var db = new FooModelDBcontext())
{
db.FooBars.Add(newFooBar);
result = db.SaveChanges() > 0;
}
return result;
}
public static FooBarDlo GetCustomer(int idFooBar)
{
FooBarDlo result;
using (var db = new FooModelDBcontext())
{
result = db.FooBars.FirstOrDefault(x => x.Id == idFooBar);
}
return result;
}
public static bool SetCustomer(FooBarDlo newFooBar)
{
bool result = false;
using (var db = new FooModelDBcontext())
{
var temp = db.FooBars.SingleOrDefault(x => x.Id == newFooBar.Id);
db.Entry(temp).CurrentValues.SetValues(newFooBar);
result = db.SaveChanges() > 0;
}
return result;
}
在保持 Bar 实现的特性的同时,如何进行重构?
答案 0 :(得分:1)
有几种方法可以解决这个问题。
您可以提供一个基类,它将泛型作为所有虚方法的参数(伪代码)
public abstract class DbLayer<T> {
public virtual T Get(int Id) {
// default implementation here
// but virtual allows overriding
}
public virtual T Create(T obj) {
// default implementation here
// but virtual allows overriding
}
}
public class FooBarDlo: DbLayer {
public override FooBarDlo Get(int Id) {
// override Get handling
}
}
但如果我是你,我会在CodeProject上找到一个预先构建的数据库层并继续使用它。