猿问

重构数据访问层

数据访问层目前重复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实现的特性?


天涯尽头无女友
浏览 128回答 1
1回答

LEATH

有几种方法可以解决这个问题。您可以提供一个基类,该基类将泛型作为所有虚拟方法的参数(伪代码)public abstract class DbLayer<T> {&nbsp; &nbsp; public virtual T Get(int Id) {&nbsp; &nbsp; &nbsp; &nbsp; // default implementation here&nbsp; &nbsp; &nbsp; &nbsp; // but virtual allows overriding&nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; public virtual T Create(T obj) {&nbsp; &nbsp; &nbsp; &nbsp; // default implementation here&nbsp; &nbsp; &nbsp; &nbsp; // but virtual allows overriding&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;}}public class FooBarDlo: DbLayer {&nbsp; &nbsp;public override FooBarDlo Get(int Id) {&nbsp; &nbsp; &nbsp; &nbsp;// override Get handling&nbsp; &nbsp;}}但如果我是你,我会在 CodeProject 上找到一个预先构建的数据库层并使用它。
随时随地看视频慕课网APP
我要回答