我想使用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;
}
}
答案 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。
重点是不要依赖实体框架为你做这一切。接口和设计模式可以帮助您编写分离得很好的软件,从长远来看,这些软件更易于测试和维护。