存储库模式和返回类型

cho*_*obo 6 c# asp.net-mvc repository repository-pattern

我正在使用存储库模式,其中每个数据库表有一个存储库类.我想知道你们如何处理只需要返回特定数量的列的查询

例如,说我有以下内容

项目表 (虚构表)

ItemId
Name
PurchaseDate
Description
Price
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我使用上面的字段创建了一个名为Item.cs的对象(当前不使用orm).

如果我有多个场景我需要返回

  1. 项目Id
  2. PurchaseDate和Name的组合
  3. ItemId和价格

哪种方法最好?

  1. 从items表中获取所有字段并返回Item对象(1个repo查询)
  2. 在Repo中创建三个查询并为每个查询返回一个Item对象
  3. 在Repo中创建三个查询并仅返回所需内容?

现在假设这个场景包含一个包含超过10个字段的表.

就个人而言,我喜欢选项一,但我不确定是否有更好的方法来解决这个问题.

jga*_*fin 8

我在需要时将方法添加到我的存储库,与通用存储库相比,无论您是否需要它们,您都可以获得一组方法.

返回IQueryable是一个漏洞的抽象.

看一下Domain Driven Design(书籍),您就会清楚地了解设计好的存储库应该是什么样子.

我还写了一篇关于通用存储库的咆哮:http://blog.gauffin.org/2012/02/generic-repositories-a-silly-abstraction-layer/


Cha*_*ell 7

我个人使用通用类型存储库并阅读 AsQueryable()

这是界面.

interface IRepository<T>
{
    void Create(T item);
    IQueryable<T> Retrieve();
    void Update(T item);
    void Delete(T item);
    void SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)

这是实施.

public class PersonsRepository : IRepository<Person>
{
    private DataContext dc;

    public PersonsRepository(DataContext dataContext)
    {
        dc = dataContext;
    }

    public void Create(Person Person)
    {
        dc.Persons.Add(Person);
    }

    public IQueryable<Person> Retrieve()
    {
        IQueryable<Person> Person = (from s in dc.Persons
                                       select s);
        return Person.AsQueryable();

    }

    public void Update(Person Person)
    {
        Person _Person = (from s in dc.Persons
                            where s.ID == Person.ID
                            select s).Single();
        {
            _Person.LastLogin = Person.LastLogin;
            _Person.Password = Person.Password;
            _Person.LastUpdate = Person.LastUpdate;
            // Cannot change your username.
        }
    }

    public void Delete(Person Person)
    {
        dc.Persons.Remove(Person);
    }

    public void SubmitChanges()
    {
        dc.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要查询存储库,则需要执行此类操作.
原谅我,下面的代码是未经测试的,我实际上更像是一个VB人:(
希望你明白了

public class PersonsService
{
    private PersonRepository<Person> personRepository;

    public PersonService()
    {
        personRepository = new PersonRepository<Person>();
    }

    public UsablePerson GetPersonByID(int ID)
    {
        UsablePerson person = (from p in personRepository<Person>.Retrieve
                               where p.ID = ID
                               select new UsablePerson { p.FirstName, 
                                                         p.LastName, 
                                                         p.EmailAddress }).FirstOrDefault();

        return person;
    }
}
Run Code Online (Sandbox Code Playgroud)

出于我的目的,我在这个特定的项目中使用LINQ,但是这可以适应你喜欢的任何数据层...这就是存储库层的美妙之处.

从这里我"个人"也有一个服务层,处理数据连接的细微差别......像GetPersonByIDGetPeopleSince(DateTime marker).这是我删除不需要的信息(IE:密码)并将剩余信息存储在ViewModel或其他POCO中的地方.