当前位置:  开发笔记 > 数据库 > 正文

存储库应该实现IQueryable <T>吗?

如何解决《存储库应该实现IQueryable<T>吗?》经验,为你挑选了2个好方法。

我正在考虑两个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,可模拟的存储库?



1> MagicKat..:

取决于您是否需要Has-A或Is-A关系.

第一个是Is-A关系.IRepository接口是一个IQueryable接口.第二个是a-a.IRepository具有IQueryable接口.在写这篇的过程中,其实我喜欢第二个好,然后第一,只是因为使用你的第二IRepository的时候,我可以给它返回的IQueryable查询()方法的任何东西.对我来说,这比第一次实施更灵活.



2> Pure.Krome..:

就个人而言,我使用它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 IQueryable source, int userId)
{
    return source.Where(u => u.UserId == userId).SingleOrDefault();
}

HTH即使这个问题是......好吧......差不多两岁了:)

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有