編集:
Generic Repository はアンチ パターンだと思います。しかし、@TomTom のコメントがわかりません。
元の回答:
Radim Köhler が述べたように、実装する必要がありますがRepository and Unit of Work patterns
、私の意見では、彼が提供した記事は完全には正しくありません。
私の現在の仕事では、これらのパターンの次の実装を使用しています。たとえば、次の 3 種類のエンティティがありますPerson, Good and Order
。Persons のリポジトリを作成しました。一般的に、リポジトリは汎用であってはなりません。このエンティティの特定のクエリを表すメソッドが含まれている必要があります。したがって、リポジトリのインターフェイスを見ると、エンティティ (Person など) に対して実行されたクエリの種類がわかります。ご覧のとおり、Person という名前の DTO を作成しましたPersonWrap
。Person から PersonWrap を作成し、PersonWrap から Person を更新するには、PersonWrap()
コンストラクターとUpdate()
メソッドの代わりに AutoMapper を使用できます。EntityFrameworkDbContext
が実装しているためUnit of Work
パターンでは、作成した DbContext をリポジトリ メソッドに提供するだけで済みます。リポジトリ メソッドが別のアクションであり、このメソッドの外部で DbContext が必要ない場合は、このメソッド内で作成して破棄できます。
public class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public DateTime RegistrationDate { get; set; }
public List<Order> Orders { get; set; }
}
public class Good {
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public class Order {
public int Id { get; set; }
public Person Person { get; set; }
public Good Good { get; set; }
public int Count { get; set; }
}
public class MyDbContext: DbContext
{
public IDbSet<Person> Persons { get { return Set<Person>(); }}
public IDbSet<Good> Goods { get { return Set<Good>(); }}
public IDbSet<Order> Orders { get { return Set<Order>(); }}
}
public class PersonRepository {
public IEnumerable<Person> GetAll() {
using (var context = new MyDbContext()) {
return context.Persons.ToList();
}
}
public IEnumerable<Person> GetLastWeekPersons() {
using (var context = new MyDbContext()) {
return context.Persons.Where(p => p.RegistrationDate > new DateTime().AddDays(-7)).ToList();
}
}
public Person GetById(int id, MyDbContext context) {
return context.Persons.Include(p => p.Orders).FirstOrDefault(p => p.Id == id);
}
public Person GetById(int id) {
using (var context = new MyDbContext()) {
return GetById(id, context);
}
}
}
public class PersonWrap {
public int Id { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public int OrderCount { get; set; }
public PersonWrap(Person person) {
Id = person.Id;
FirstName = person.FirstName;
SecondName = person.SecondName;
OrderCount = person.Orders.Count;
}
public void Update(Person person) {
person.FirstName = FirstName;
person.SecondName = SecondName;
}
}
public class PersonDetailsViewController {
public PersonWrap Person { get; protected set; }
public PersonDetailsViewController(int personId) {
var person = new PersonRepository().GetById(personId);
if (person != null) {
Person = new PersonWrap(person);
}
}
public void Save() {
using (var context = new MyDbContext()) {
var person = new PersonRepository().GetById(Person.Id, context);
Person.Update(person);
context.SaveChanges();
}
}
}