重构数据访问层

时间:2018-05-22 13:49:52

标签: c# refactoring

数据访问层目前是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 实现的特性的同时,如何进行重构?

1 个答案:

答案 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上找到一个预先构建的数据库层并继续使用它。