Tag: 域驱动设计

在域驱动设计中,在域对象中调用其他对象的repostiories会违反DDD吗?

我正在重构一个正在包装的项目的代码,最后我把很多业务逻辑放到服务类而不是域对象中。 此时,大多数域对象仅是数据容器。 我决定在服务对象中编写大部分业务逻辑,然后将所有内容重构为更好,更可重用和更易读的形状。 这样我就可以决定应该将哪些代码放入域对象中,以及将哪些代码分解为自己的新对象,以及应该在服务类中保留哪些代码。 所以我有一些代码: public decimal CaculateBatchTotal(VendorApplicationBatch batch) { IList applications = AppRepo.GetByBatchId(batch.Id); if (applications == null || applications.Count == 0) throw new ArgumentException(“There were no applications for this batch, that shouldn’t be possible”); decimal total = 0m; foreach (VendorApplication app in applications) total += app.Amount; return total; } 这段代码似乎是对域对象的一个​​很好的补充,因为它的唯一输入参数是域对象本身。 似乎是一些重构的完美候选者。 但唯一的问题是该对象调用另一个对象的存储库。 这让我想把它留在服务类中。 我的问题是这样的: […]

我应该在哪里对DDD进行独特的检查?

我正在研究我的第一个DDD项目,我想我了解实体,数据访问对象及其关系的基本角色。 我有一个基本的validation实现,它将每个validation规则与其关联的实体一起存储。 这适用于仅适用于当前实体的规则,但在需要其他数据时会崩溃。 例如,如果我有一个用户名必须唯一的限制,我希望IsValid()调用在存在具有当前名称的现有用户时返回false。 但是,我没有找到任何干净的方法来保持实体本身的validation规则。 我想在实体上有一个IsNameUnique函数,但是大多数执行此操作的解决方案都需要我注入一个用户数据访问对象。 这个逻辑应该在外部服务吗? 如果是这样,我如何仍然保持与实体本身的逻辑? 或者这是应该在用户实体之外的东西? 谢谢!

EF代码优先:如何在跟踪DDD时从实体的Collection中删除一行?

所以这是场景: DDD声明您使用存储库来获取聚合根,然后使用它来添加/删除它拥有的任何集合。 添加很简单,您可以在要添加的Collection上简单地调用.Add(Item item) 。 保存时,会在数据库中添加一个新行。 但是,删除是不同的 – 调用.Remove(Item item)不会从数据库中删除该项,它只是删除外键。 所以,虽然,是的,它在技术上不再是集合的一部分,它仍然在数据库中。 阅读,唯一的解决方案是使用数据上下文删除它。 但根据DDD,域对象不应该知道数据上下文,因此删除必须在域外进行。 什么是正确的方法? 或者让数据库中的孤儿可以接受(也许是运行例程来清除它们)?

有没有使用DDD(域驱动设计)的开源项目?

我正在努力理解DDD背后的概念,但我发现通过阅读书籍很难理解,因为他们倾向于以相当抽象的方式讨论这个主题。 我想在代码中看到一些优秀的DDD实现,最好是在C#中。 在开源世界中有没有很好的DDD项目实例?

如何减少域/实体/ DTO对象的重复?

我正在重新设计我当前的项目以使其更易于维护,并尽力遵循良好的设计实践。 目前我有一个Silverlight组件的解决方案,用于所述SL应用程序的ASP.Net主机,该应用程序还包含WCF RIA服务和共享类库,因此SL和WCF服务都可以共享对象。 业务逻辑遍布各处,所有CRUD操作都在我的WCF服务中手动编码。 所以,我正在为一切创建一个新的结构,并将这个混乱移植到新的格式。 在这样做的过程中,当我不知道自己是否应该这样时,我发现我正在复制课程。 我的新结构如下: 客户: Reporting.Silverlight = Silverlight应用程序。 这将参考我的DTO课程。 Reporting.Web =持有我的SL应用程序,是人们进入它的主要切入点。 商业: Reporting.Services =我的WCF服务就在这里。 我的SL应用程序将调用此方法来执行操作,这些服务将返回DTO类。 Reporting.Services.Contracts =保存我的WCF服务接口,并包含带有DataContract装饰器的DTO类。 Reporting.Domain =保存我的域对象和业务逻辑 数据: Reporting.Data.Contract =保存我的存储库和工作单元的接口 Reporting.Data =存储库/ UoW的具体实现。 这里定义了Entity Framework 5上下文。 Reporting.Data.Models =保存我的所有Entity对象,以便EF5可以用SQL做它的事情。 我有3个地方,我几乎完全相同的课程,对我来说它闻起来。 在Reporting.Services.Contracts内部,我有一个DTO,可以交给SL客户端。 这是一个例子: [DataContract(Name = “ComputerDTO”)] public class ComputerDTO { [DataMember(Name = “Hostname”)] public string Hostname { get; set; } [DataMember(Name = […]

如何实现Repository FindAll()方法?

我有以下存储库模式。 要求是“查找所有者姓名为Lijo的所有帐户”。 所以,我需要编写一个FindAll函数。 怎么写这个function? 限制是: 1)客户端“BankAccountService”不应使用“DBML_Project”中的类。 2)我们不应该使用GetAll方法来退出完整的帐户列表,然后进行过滤。 注意:我在处理多态性问题时遇到了这个问题:ORM实体是域实体还是数据实体? 码 namespace ApplicationService_Bank { public class BankAccountService { RepositoryLayer.ILijosBankRepository accountRepository = new RepositoryLayer.LijosSimpleBankRepository(); public void FreezeAllAccountsForUser(string userName) { //Should not use assembly ‘DBML_Project’. IEnumerable accountsForUserWithNameLIJO = null; //accountsForUserWithNameLIJO = accountRepository.FindAll(p => p.BankUser.Name == “Lijo”); } } } namespace RepositoryLayer { public interface ILijosBankRepository { List GetAll(); IEnumerable […]

如何使用DDD / CQRS编写function

我有一个银行帐户域名,如下所示。 可以有SavingsAccount,LoanAccount,FixedAccount等。 一个用户可以拥有多个帐户。 我需要添加一个新function – 为用户获取所有帐户。 编写函数应该在哪里以及如何编写? 如果解决方案遵循SOLID原则(开放原则,……)和DDD,那将是很好的。 任何可以使代码更好的重构都是受欢迎的。 注意:AccountManipulator将由网站客户端通过Web服务使用。 namespace BankAccountBL { public class AccountManipulator { //Whether it should beprivate or public? private IAccount acc; public AccountManipulator(int accountNumber) { acc = AccountFactory.GetAccount(accountNumber); } public void FreezeAccount() { acc.Freeze(); } } public interface IAccount { void Freeze(); } public class AccountFactory { public static IAccount […]

MVVM:修改模型,如何正确更新ViewModel和View?

案件 假设我有一个Person类,一个PersonViewModel和一个PersonView 。 将PersonView中的属性更新为Person模型非常简单。 PersonViewModel包含一个Person对象,并具有PersonView绑定的公共属性,以便更新Person模型。 然而。 想象一下, Person模型可以通过Service更新。 现在需要将属性更改传递给PersonViewModel ,然后传递给PersonView 。 我就是这样解决的: 对于Person模型中的每个属性,我都会引发PropertyChanged事件。 PersonViewModel订阅Person的PropertyChanged事件。 然后PersonViewModel将引发另一个PropertyChanged以更新PersonView 。 这对我来说似乎是最明显的方式,但我有点想把这个问题抛到那里,希望有人能给我一个更好的方法。 这真的很简单,还是有更好的方法将模型标记为已修改并更新ViewModel上的相应属性? 附加 PersonView的DataContext是PersonViewModel 。 Person从JSON填充并在其生命周期内多次更新。 随意为我的特定情况建议架构更改。 回答 我将aqwert标记为我问题的答案,因为它为我提供了我已经提出的解决方案的替代方案。

在值对象的不可变对象和结构之间进行选择

如何在实现值对象(作为地址的规范示例)作为不可变对象或结构之间进行选择? 选择一个是否具有性能,语义或任何其他好处?

在存储库模式中加载子记录

使用LINQ TO SQL作为基于存储库的解决方案的基础。 我的实现如下: IRepository FindAll FindByID Insert Update Delete 然后我有扩展方法,用于查询结果: WhereSomethingEqualsTrue() … 我的问题如下: 我的用户存储库有N个角色。 我是否创建了角色存储库来管理角色? 我担心如果我走这条路,我最终会创建几十个存储库(每个表1个,几乎除了连接表)。 每个表的存储库是否常见?