cho*_*obo 6 c# asp.net-mvc repository repository-pattern
我正在使用存储库模式,其中每个数据库表有一个存储库类.我想知道你们如何处理只需要返回特定数量的列的查询
例如,说我有以下内容
项目表 (虚构表)
ItemId
Name
PurchaseDate
Description
Price
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我使用上面的字段创建了一个名为Item.cs的对象(当前不使用orm).
如果我有多个场景我需要返回
哪种方法最好?
现在假设这个场景包含一个包含超过10个字段的表.
就个人而言,我喜欢选项一,但我不确定是否有更好的方法来解决这个问题.
我在需要时将方法添加到我的存储库,与通用存储库相比,无论您是否需要它们,您都可以获得一组方法.
返回IQueryable是一个漏洞的抽象.
看一下Domain Driven Design(书籍),您就会清楚地了解设计好的存储库应该是什么样子.
我还写了一篇关于通用存储库的咆哮:http://blog.gauffin.org/2012/02/generic-repositories-a-silly-abstraction-layer/
我个人使用通用类型存储库并阅读 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,但是这可以适应你喜欢的任何数据层...这就是存储库层的美妙之处.
从这里我"个人"也有一个服务层,处理数据连接的细微差别......像GetPersonByID或GetPeopleSince(DateTime marker).这是我删除不需要的信息(IE:密码)并将剩余信息存储在ViewModel或其他POCO中的地方.
| 归档时间: |
|
| 查看次数: |
7489 次 |
| 最近记录: |