如何在没有存储库模式的情况下实现服务层和验证

时间:2015-04-04 16:04:47

标签: c# entity-framework repository-pattern

我想使用Entity Framework和WinForms构建一个简单的酒店重新设定系统。我已经读到EF已经实现了存储库模式的所有地方,并且DbContext是UoW,每个DbSet都是一个存储库,因此使用RP会使事情变得多余。那么如何跳过它并使用服务层呢?在查询数据库之前,此服务中包含哪些操作以及在何处验证对象? 以下是我认为我应该这样做的方式:

public class ReservationService : //(Some useful interface should be here, what do  you suggest?)
{
    public void MakeReservation(Reservation reservation)
    {
        //Validate reservation
        //Save reservation
    }
    public IEnumerable<Reservation> GetReservationsByDate(DateTime date)
    {
        //Linq queries
    }
    public IEnumerable<Reservation> GetReservationsByName(string name)
    {
        //Linq queries
    }
    public IEnumerable<Room> GetRoomsAvailable()
    {
        //Linq queries
    }
    public IEnumerable<Room> GetRoomsAvailableByDate(DateTime date)
    {

    }
}

修改:以下是我实施验证的方式:

public class ReservationValidator : Validator<Reservation>
{
    public ReservationValidator()
    {
        this.Errors = new Dictionary<string, string>();
    }
    public override bool Validate(Reservation reservation)
    {
        if (logic here)
            this.Errors.Add("somePropertyName", "someMessage");
        if (Errors.Count > 0)
        {
            return false;
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:-1)

如果您在界面后面使用通用存储库模式,那么您可以轻松测试可重复使用的代码。您的存储库实现将公开相关查询。测试时,可以为内存集合切换基础数据存储。如果您依赖于对模型进行强类型化的dbcontext,则测试变得更加困难并且依赖于数据库查询。例如

 public interface IRepository<T,TId>{

 T GetById(TId id);

  Etc etc

  } 

对于您的dB访问:

Public class MyConcreteDbRepos<T,TId> : IRepository<T,TId>{
      Implementation here
}

为了您的测试:

Public class MyInMemoryRepos<T,TId> : IRepository<T,TId>{
   Implantation here
}

此实现依赖于您自己的工作单元来保存dbset的存储库(为简洁起见,省略)。如果抽象太重,你不必这样做。您可以通过方法公开泛型方面,并使一个repos包含dbcontext。您可以从dbcontext中一般选择dbset。

重点是不要依赖实体框架为你做这一切。接口和设计模式可以帮助您编写分离得很好的软件,从长远来看,这些软件更易于测试和维护。