我很难找到在 DDD 样式模式中使用 EF 的直接示例。这也是我第一次使用 DDD,对解决方案布局以及如何使用一些 DDD 模式有一些疑问。
1) 我见过的关于使用带有 EF 的 Repository 模式的大多数示例只显示了专门的模型接口(interface),例如 IContactRepository,然后是实现该接口(interface)的具体类型。理想情况下,我喜欢使用 IRepository 之类的东西,它具有用于 CRUD 操作的基本功能集。如有必要,我可以创建专门的存储库,例如 IContactRepository : IRepository 必要时,因为我的大多数模型不需要扩展。我是不是叫错了树?有人可以为我提供这种实现风格的示例吗?
2) 现在我将我的解决方案分解为以下三个项目:模型(包含我的 EDM)、存储库和服务。这是合适的还是有另一种布局方法我没有考虑并且应该考虑?
3)我已经看到了具有返回 IQueryable 的 Query(Func)/Query() 方法的存储库示例。这是臭的还是不受欢迎的东西?
最佳答案
我想回答#3...
我认为它不那么“臭”,更“懒惰”。这是我在互联网上看到的一个典型的“存储库”......
public interface IRepository {
// Query operations.
IQueryable<T> All<T>();
IQueryable<T> Find<T>(Expression<Func<T, bool>> expression);
T Single<T>(Expression<Func<T, bool>> expression);
// Save operations.
T Add<T>(T objectToAdd);
void Delete<T>(T objectToDelete);
T Update<T>(T objectToUpdate);
}
据我所知,这不是一个存储库,而是一个“ session ”或“工作单元”。这是一种将您正在使用的任何数据库技术抽象出来并转而与极其通用的接口(interface)对话的便捷方式。因此,让我们将其重命名为
ISession
。这是我最近一直在做的模式。public class PeopleRepository {
private readonly ISession session;
public PeopleRepository(ISession session) {
this.session = session;
}
public virtual IEnumerable<Person> Active() {
return session.Find<Person>(p => p.Active).OrderBy(p => p.LastName).ThenBy(p => p.FirstName);
}
public virtual IEnumerable<Person> ByLastName(string name) {
return session.Find<Person>(p => p.Active && p.LastName.StartsWith(lastName)).OrderBy(p => p.LastName).ThenBy(p => p.FirstName);
}
public virtual void DeletePerson(int personId) {
// We don't really delete people; we mark them as inactive.
var person = session.Single<Person>(p => p.Id == personId);
person.Active = false;
session.Update(person);
}
}
在此设置中,
ISession
是数据存储的通用链接。然而, PersonRepository
非常特定于对 Person
对象执行的查询和操作的类型。希望这可以帮助。
关于entity-framework - 关于Entity Framework + DDD的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1527975/