我正在考虑两个IRepository接口中的一个,一个是IQueryable的后代,另一个是IQueryable.
像这样:
public interface IRepository: IQueryable { T Save(T entity); void Delete(T entity); }
或这个:
public interface IRepository{ T Save(T entity); void Delete(T entity); IQueryable Query(); }
LINQ用法是:
from dos in ServiceLocator.Current.GetInstance>() where dos.Id == id select dos
要么...
from dos in ServiceLocator.Current.GetInstance>().Query where dos.Id == id select dos
我有点像第一个,但是模拟是有问题的.其他人如何实现LINQable,可模拟的存储库?
取决于您是否需要Has-A或Is-A关系.
第一个是Is-A关系.IRepository接口是一个IQueryable接口.第二个是a-a.IRepository具有IQueryable接口.在写这篇的过程中,其实我喜欢第二个好,然后第一,只是因为使用你的第二IRepository的时候,我可以给它返回的IQueryable查询()方法的任何东西.对我来说,这比第一次实施更灵活.
就个人而言,我使用它Repository Pattern
来从存储库中返回所有项目IQueryable
.通过这样做,我的存储库层现在非常轻,小..使用服务层(消耗存储库层)现在可以对所有类型的查询操作开放.
基本上,我的所有逻辑现在都位于服务层(它不知道它将使用什么类型的存储库......并且不想知道< - 关注点的分离)..而我的存储库层只是处理获取数据并将数据保存到repo(一个sql server,一个文件,一个太空中的卫星......等等 - 更多的关注点分离).
例如.或多或少的pseduo代码,因为我记得我们在代码中所做的事情并简化了这个答案......
public interface IRepository{ IQueryable Find(); void Save(T entity); void Delete(T entity); }
并拥有一个用户存储库......
public class UserRepository : IRepository{ public IQueryable Find() { // Context is some Entity Framework context or // Linq-to-Sql or NHib or an Xml file, etc... // I didn't bother adding this, to this example code. return context.Users().AsQueryable(); } // ... etc }
而现在最好的位:)
public void UserServices : IUserServices { private readonly IRepository_userRepository; public UserServices(IRepository userRepository) { _userRepository = userRepository; } public User FindById(int userId) { return _userRepository.Find() .WithUserId(userId) .SingleOrDefault(); // <-- This will be null, if the // user doesn't exist // in the repository. } // Note: some people might not want the FindBySingle method because this // uber method can do that, also. But i wanted to show u the power // of having the Repository return an IQuerable. public User FindSingle(Expression > predicate) { return _userRepository .Find() .SingleOrDefault(predicate); } }
奖励积分:WTF WithUserId(userId)
在FindById
方法中?这是一个管道和过滤器.使用它们:)爱他们:)拥抱他们:)他们让你的代码SOOO更具可读性:)现在,如果你想知道它做什么..这是扩展方法.
public static User WithId(this IQueryablesource, int userId) { return source.Where(u => u.UserId == userId).SingleOrDefault(); }
HTH即使这个问题是......好吧......差不多两岁了:)