asp.net-mvc – 每个实现的存储库模式的优缺点
|
嗨,看看通常似乎实现的存储库模式,如: public class GenericRepository<TEntity> where TEntity : class
{
// other business
public virtual TEntity GetByID(object id)
{
return db.Set().Find(id);
}
public virtual void Insert(TEntity entity)
{
db.Set().Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = db.Set().Find(id);
Delete(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
db.Set().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
因此,对于您要使用的每种类型(即更新),您需要实例化存储库. 所以,如果我有两种类型,我想保存汽车和卡车,我需要去: var carRepository = new GernericRepository<Car>(); carRepository.Update(myCar); var truckRepository = new GernericRepository<Truck>(); carRepository.Update(myTruck); 那么你就为每种类型都有单独的存储库.要确保一次保存所有内容,您需要unitOfWork以确保它们都使用相同的上下文并一次保存. 当然不会有更好的东西,如: public class GenericRepository
{
// other business
public virtual TEntity GetByID<TEntity>(object id) where TEntity : class
{
return db.Set<TEntity>().Find(id);
}
public virtual void Insert<TEntity>(TEntity entity) where TEntity : class
{
db.Set<TEntity>().Add(entity);
}
public virtual void Delete<TEntity>(object id) where TEntity : class
{
TEntity entityToDelete = db.Set<TEntity>().Find(id);
Delete(entityToDelete);
}
public virtual void Update<TEntity>(TEntity entityToUpdate) where TEntity : class
{
db.Set<TEntity>().Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
这意味着存储库只需要实例化一次,因此是真正通用的吗? 所以你可以这样更新你的汽车和卡车: var repository = new GernericRepository<Car>(); repository.Update<Car>(myCar); rRepository.Update<Truck>(myTruck); 当然这是一个更好的方法?我错过了什么吗?它自动也只有一个上下文. 解决方法存储库模式不会将数据访问与数据存储分离,这就是NHIBnate或Enity Framework等ETL工具所做的事情.存储库模式提供了可重用的数据提取方法.我之前使用了一个所谓的“通用”存储库,如你所描述并认为它很棒.直到你意识到你刚刚在NHibernate或实体框架之上放置了另一层,你才意识到它已经全部消失了Pete Tong. 理想情况下,您需要的是描述从数据存储中获取数据的方式的接口,并且不应泄漏您正在使用的数据访问.例如: public interface IEmployee interface
{
IEmployee GetEmployeeById(Guid employeeId);
IEmployee GetEmployeeByEmployeeNumber(string employeeNumber);
IEnumerable<IEmployee> GetAllEmployeesWithSurname(string surname);
IEnumerable<IEmployee> GetAllEmployeesWithStartDateBetween(DateTime beginDateTime,DateTime endDateTime);
}
这为您提供了代码合同,您不了解持久层,并且用于检索数据的查询可以单独进行单元测试.接口可以从提供常见CRUD方法的基接口继承,但您可以假设所有存储库都需要CRUD. 如果你走在通用存储库的道路上,你最终会在查询中出现重复,你会发现使用存储库的代码进行单元测试要困难得多,因为你也必须测试查询. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – ASP.Net核心maxUrlLength
- asp.net-mvc – 在控制器中创建操作链接
- asp.net-mvc-4 – 在asp.net mvc 4模型中更改验证触发顺序
- asp.net – 如何处理在IIS上运行的网站的计划任务?
- asp.net-mvc – 更改MVC4上的基本视图类型
- asp.net-mvc – ASP.NET MVC – ModelState.IsValid是false
- asp.net-mvc – 如何为未经过身份验证的用户隐藏我的菜单?
- asp.net – 动画gif不动画提交
- asp.net – 无法编写输出文件… pdb visual studio 2010
- asp.net – 控制FormsAuthentication createPersistentCook
- asp.net-mvc – 如何使用ASP.NET MVC在我的现有数
- asp.net – 如何拒绝用户访问子文件夹和文件?
- asp.net – 获取客户端隐藏字段的值
- asp.net – 如何在Visual Studio中添加NUnit
- asp.net – 何时覆盖OnError?
- 一个简答的Access下的分页asp.net代码
- asp.net-mvc – asp.net mvc – 如何告诉子操作忽
- asp.net-mvc – 在REST Web API调用中返回复杂对
- asp.net – 在OnRowUpdating事件中,GridView的Ne
- asp.net-4.0 – Asp.net 4.0:如何在自定义错误页
