And*_*y S 27 .net linq design-patterns
我正在考虑两个IRepository接口中的一个,一个是IQueryable的后代,另一个是IQueryable.
像这样:
public interface IRepository<T> : IQueryable<T>
{
T Save(T entity);
void Delete(T entity);
}
Run Code Online (Sandbox Code Playgroud)
或这个:
public interface IRepository<T>
{
T Save(T entity);
void Delete(T entity);
IQueryable<T> Query();
}
Run Code Online (Sandbox Code Playgroud)
LINQ用法是:
from dos
in ServiceLocator.Current.GetInstance<IRepository<DomainObject>>()
where dos.Id == id
select dos
Run Code Online (Sandbox Code Playgroud)
要么...
from dos
in ServiceLocator.Current.GetInstance<IRepository<DomainObject>>().Query
where dos.Id == id
select dos
Run Code Online (Sandbox Code Playgroud)
我有点像第一个,但是模拟是有问题的.其他人如何实现LINQable,可模拟的存储库?
Mag*_*Kat 14
取决于您是否需要Has-A或Is-A关系.
第一个是Is-A关系.IRepository接口是一个IQueryable接口.第二个是a-a.IRepository具有IQueryable接口.在写这篇的过程中,其实我喜欢第二个好,然后第一,只是因为使用你的第二IRepository的时候,我可以给它返回的IQueryable查询()方法的任何东西.对我来说,这比第一次实施更灵活.
就个人而言,我使用它Repository Pattern来从存储库中返回所有项目IQueryable.通过这样做,我的存储库层现在非常轻,小..使用服务层(消耗存储库层)现在可以对所有类型的查询操作开放.
基本上,我的所有逻辑现在都位于服务层(它不知道它将使用什么类型的存储库......并且不想知道< - 关注点的分离)..而我的存储库层只是处理获取数据并将数据保存到repo(一个sql server,一个文件,一个太空中的卫星......等等 - 更多的关注点分离).
例如.或多或少的pseduo代码,因为我记得我们在代码中所做的事情并简化了这个答案......
public interface IRepository<T>
{
IQueryable<T> Find();
void Save(T entity);
void Delete(T entity);
}
Run Code Online (Sandbox Code Playgroud)
并拥有一个用户存储库......
public class UserRepository : IRepository<User>
{
public IQueryable<User> 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
}
Run Code Online (Sandbox Code Playgroud)
而现在最好的位:)
public void UserServices : IUserServices
{
private readonly IRepository<User> _userRepository;
public UserServices(IRepository<User> 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<Func<User, bool>> predicate)
{
return _userRepository
.Find()
.SingleOrDefault(predicate);
}
}
Run Code Online (Sandbox Code Playgroud)
奖励积分:WTF WithUserId(userId)在FindById方法中?这是一个管道和过滤器.使用它们:)爱他们:)拥抱他们:)他们让你的代码SOOO更具可读性:)现在,如果你想知道它做什么..这是扩展方法.
public static User WithId(this IQueryable<User> source, int userId)
{
return source.Where(u => u.UserId == userId).SingleOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
HTH即使这个问题是......好吧......差不多两岁了:)
| 归档时间: |
|
| 查看次数: |
5159 次 |
| 最近记录: |