gpt4 book ai didi

entity-framework - 关于 Entity Framework + DDD 的问题

转载 作者:行者123 更新时间:2023-12-04 07:26:32 25 4
gpt4 key购买 nike

我很难找到在 DDD 样式模式中使用 EF 的直接示例。这也是我第一次使用 DDD,有几个关于解决方案布局以及如何使用某些 DDD 模式的问题。

1) 我见过的大多数关于使用带有 EF 的存储库模式的示例只显示了专门的模型接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com