我個人使用的通用型存儲庫,並有我的閱讀AsQueryable()
這裏的接口。
interface IRepository<T>
{
void Create(T item);
IQueryable<T> Retrieve();
void Update(T item);
void Delete(T item);
void SubmitChanges();
}
這裏是實施。
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();
}
}
現在,如果您需要查詢存儲庫,您想要做這樣的事情。
原諒我,下面的代碼是未經測試,我其實更多的是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;
}
}
對於我的目的,我使用LINQ在這個特別的項目,但這可以適應任何你喜歡的數據層...這是一個儲存庫層的美麗。
從這裏我「個人」也有一個服務層,處理數據連接的細微差別......像GetPersonByID
或GetPeopleSince(DateTime marker)
這是我去掉信息的地方我不需要(IE:密碼)並將其餘信息存儲在ViewModel或其他POCO中。
只是爲了看看我是否在同一頁面上。對於像(GetPersonByID)這樣的更具體的查詢,您將從Repo中返回整個人員記錄,然後在服務層中刪除所有不需要的信息並返回該ID?你能舉出一個這樣的例子嗎,因爲這是我很難過的事情。我不確定我是否應該創建大量的Repo方法,或者只是有一個總是返回所有表列(即整行) – chobo 2012-02-27 17:57:12
我盡我最大的努力從內存中...我沒有我的IDE在我面前所以在上面的例子中可能有一些錯誤。希望你能得到照片。 – 2012-02-27 18:28:50
我喜歡這種技術,因爲它減少了存儲庫中的方法數量。但是,我總是被教導,你應該只從數據庫中返回你需要的列,看起來你在使用Repository時總是返回一個實體類型或實體集合。這是Repository模式的意圖嗎?也許我在考慮數據庫性能的影響 – chobo 2012-02-27 18:53:09