标签: domain-driven-design

如何避免使用域驱动设计的非常大的对象

我们正在关注领域驱动设计以实现大型网站.

但是,通过将行为放在域对象上,我们最终得到了一些非常大的类.

例如,在我们的WebsiteUser对象上,我们有许多方法 - 例如处理密码,订单历史记录,退款,客户细分.所有这些方法都与用户直接相关.其中许多方法内部委托给其他子对象,但这
仍然导致一些非常大的类.

我很想避免暴露很多子对象,例如user.getOrderHistory().getLatestOrder().

可以使用哪些其他策略来避免这些问题?

.net java oop design-patterns domain-driven-design

28
推荐指数
4
解决办法
3054
查看次数

事件采购和读取模型生成

假设Stack Overflow域问题和以下事件定义:

UserRegistered(UserId, Name, Email)
UserNameChanged(UserId, Name)
QuestionAsked(UserId, QuestionId, Title, Question)
Run Code Online (Sandbox Code Playgroud)

假设事件存储的状态如下(按出现顺序):

1) UserRegistered(1, "John", "john@gmail.com")
2) UserNameChanged(1, "SuperJohn")
3) UserNameChanged(1, "John007")
4) QuestionAsked(1, 1, "Help!", "Please!")
Run Code Online (Sandbox Code Playgroud)

假设以下非规范化读取模型列出问题列表(对于SO的第一页):

QuestionItem(UserId, QuestionId, QuestionTitle, Question, UserName)
Run Code Online (Sandbox Code Playgroud)

以下事件处理程序(构建非规范化读取模型):

public class QuestionEventsHandler
{
    public void Handle(QuestionAsked question)
    {
        var item = new QuestionItem(
            question.UserId, 
            question.QuestionId, 
            question.Title, 
            question.Question, 
            ??? /* how should i get name of the user? */);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何找到提出问题的用户的姓名?或者更常见的是:如果我的非规范化读取模型需要在特定事件中不存在的附加数据,我应该如何处理事件?

我已经研究CQRS包括现有的样本SimpleSQRS格雷格年轻的Fohjin马克Nijhof的样品.但在我看来,他们只使用事件中包含的数据.

domain-driven-design cqrs event-sourcing

28
推荐指数
2
解决办法
4412
查看次数

在使用ORM解决方案的ASP.NET MVC中工作时,是否需要使用Repository模式?

我有点好奇其他开发人员在使用Entity Framework或NHibernate在ASP.NET MVC中编程时应用Repository模式的经验.在我看来,这种模式已经在ORM中实现了.DbContextDbSet<T>在实体框架和ISessionNHibernate中.这些Repository模式中提到的大部分问题- 如POEEDDD编目- 都是由这些ORM非常充分地实现的.即这些问题是,

  • 坚持
  • OO查看数据
  • 数据访问逻辑抽象
  • 查询访问逻辑

此外,我见过的大多数存储库模式的实现都遵循这种实现模式 - 假设我们正在开发一个博客应用程序.

NHibernate实现:

public class PostRepository : IPostRepository
{
    private ISession _session;

    public PostRepository(ISession session)
    {
        _session = session;
    }

    public void Add(Post post)
    {
        _session.Save(post);
    }

    // other crud methods. 
}
Run Code Online (Sandbox Code Playgroud)

实体框架:

public class PostRepository : IPostRepository
{
    private DbContext _session;

    public PostRepository(DbContext session)
    {
        _session = session;
    }

    public void Add(Post post)
    {
        _session.Posts.Add(post);
        -session.SaveChanges();
    } …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc orm design-patterns domain-driven-design

28
推荐指数
1
解决办法
6779
查看次数

MVVM:绑定到Model,同时保持Model与服务器版本同步

我花了很多时间尝试为以下挑战找到一个优雅的解决方案.我一直无法找到解决问题的解决方案.

我有一个简单的View,ViewModel和Model设置.为了便于解释,我会保持简单.

  • Model有一个名为TitleString类型的属性.
  • Model是在DataContext的View.
  • ViewTextBlock这就是数据绑定到Title的模型.
  • ViewModel有一个名为方法Save(),将保存ModelServer
  • Server可推到所做的更改Model

到现在为止还挺好.现在我需要进行两项调整才能使模型与a保持同步Server.服务器的类型并不重要.只要知道我需要调用Save()才能将模型推送到Server.

调整1:

  • Model.Title属性将需要调用RaisePropertyChanged(),以转换为所做的更改ModelServerView.这很好用,因为它Model是DataContextView

还不错.

调整2:

  • 下一步是调用Save()保存从所做的更改ViewModelServer.这是我被卡住的地方.当模型被更改时,我可以处理调用Save()的Model.PropertyChanged事件,ViewModel但这会使它回显服务器所做的更改.

我正在寻找一个优雅而合理的解决方案,如果有意义,我愿意改变我的架构.

c# silverlight domain-driven-design prism mvvm

28
推荐指数
2
解决办法
2万
查看次数

如何组织领域驱动的设计项目?

我已经开始学习DDD,并想知道其他人如何组织他们的项目.

我开始组织我的AggregateRoots:

MyApp.Domain(域模型的命名空间)

MyApp.Domain.Product
- 产品
- IProductService
- IProductRepository
- 等

MyApp.Domain.Comment
- 评论
- ICommentService
- ICommentRepository
- 等

MyApp.Infrastructure
- ...

MyApp.Repositories
- ProductRepository:IProductRepository
- 等

我遇到的问题是我必须将我的域名产品称为MyApp.Domain.Product.Product或Product.Product.我也与产品的linq数据模型发生冲突....我必须使用丑陋的代码行来解析两者之间的问题,例如MyApp.Domain.Product.Product和MyApp.Respoitories.Product.

我真的很想知道其他人如何组织他们的DDD解决方案......

我使用Visual Studio作为我的IDE.

非常感谢.

domain-driven-design organization

27
推荐指数
2
解决办法
1万
查看次数

实现域驱动设计的功能方式

我在使用C#编写域驱动的应用程序方面有很多经验.我写的应用程序越多,我发现我想采用一种与标准C#/ OO技术不相符的方法:

  1. 我想编写尽可能多的纯函数,因为它们很容易测试.
  2. 我想以更具声明性的方式编写我的业务逻辑.

所以我一直在研究F#等函数式语言.毕竟没有理由为什么领域驱动设计使用OO实现.

我想知道是否有人在使用功能语言时对域驱动设计设计有任何想法/经验.特别:

  • 功能域模型会是什么样的?
  • 您将如何从域模型中抽象数据访问层.

.net f# domain-driven-design

27
推荐指数
3
解决办法
2081
查看次数

聚合根引用其他聚合根

我目前正在使用DDD工作很多,并且在从其他聚合根加载/操作聚合根时遇到问题.

对于我模型中的每个聚合根,我也有一个存储库.存储库负责处理根的持久性操作.

假设我有两个聚合根,包含一些成员(实体和值对象).

AggregateRoot1和AggregateRoot2.

AggregateRoot1有一个引用AggregateRoot2的实体成员.

  1. 当我加载AggregateRoot1时,我是否应该加载AggregateRoot2?
  2. AggregateRoot2的存储库是否应对此负责?
  3. 如果是这样,AggregateRoot1中的实体是否可以调用AggregateRoot2的存储库进行加载?

此外,当我在AggregateRoot1中的实体与AggregateRoot2之间创建关联时,是应该通过实体还是通过AggregateRoot2的存储库来完成?

希望我的问题有道理.

[编辑]

当前的解决方案

Twith2Sugars的帮助下,我提出了以下解决方案:

如问题中所述,聚合根可以具有引用其他根的子项.将root2分配给root1的其中一个成员时,root1的存储库将负责检测此更改,并将其委派给root2的存储库.

public void SomeMethod()
{
    AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
    root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
    AggregateRoot1Repository.Update(root1);
}

public class AggregateRoot1Repository
{
    public static void Update(AggregateRoot1 root1)
    {
        //Implement some mechanism to detect changes to referenced roots
        AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的例子,没有Demeter法或其他最佳原则/实践包括:-)

进一步评论赞赏.

domain-driven-design aggregate loading repository aggregateroot

27
推荐指数
2
解决办法
1万
查看次数

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

案件

说我有一个Person班级,一个PersonViewModel和一个PersonView.

将属性更新PersonViewPerson模型很简单.PersonViewModel包含一个Person对象,并具有PersonView绑定到的公共属性,以便更新Person模型.

然而.

想象一下,Person模型可以更新Service.现在需要将属性更改传达给PersonViewModel然后再传递给PersonView.

我就是这样解决的:

对于Person模型中的每个属性,我将引发PropertyChanged事件.PersonViewModel订阅了PropertyChanged事件Person.PersonViewModel然后会引发另一个PropertyChanged以更新PersonView.

这对我来说似乎是最明显的方式,但我有点想把这个问题抛到那里,希望有人能给我一个更好的方法.这真的很简单,还是有更好的方法将模型标记为已修改并更新ViewModel上的相应属性?

附加

PersonView的DataContext的是PersonViewModel.Person从JSON填充并在其生命周期内多次更新.

随意为我的特定情况建议架构更改.

回答

我将aqwert标记为我问题的答案,因为它为我提供了我已经提出的解决方案的替代方案.

c# silverlight domain-driven-design prism mvvm

27
推荐指数
2
解决办法
3万
查看次数

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

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

在开源世界中有没有很好的DDD项目实例?

c# architecture open-source domain-driven-design

26
推荐指数
3
解决办法
1万
查看次数

为什么实体框架需要ICollection来进行延迟加载?

我想写一个丰富的域类,如

public class Product    
{    
   public IEnumerable<Photo> Photos {get; private set;}    
   public void AddPhoto(){...}    
   public void RemovePhoto(){...}
 }
Run Code Online (Sandbox Code Playgroud)

但实体框架(V4代码第一种方法)需要一个ICollection类型来进行延迟加载!上面的代码不再按设计工作,因为客户端可以绕过AddPhoto/RemovePhoto方法并直接在ICollection上调用add方法.这个不好.

public class Product    
{    
   public ICollection<Photo> Photos {get; private set;} //Bad    
   public void AddPhoto(){...}    
   public void RemovePhoto(){...}    
 }
Run Code Online (Sandbox Code Playgroud)

尝试使用EF4实现DDD真的很令人沮丧.为什么他们选择ICollection进行延迟加载?

我怎么能克服这个?NHibernate能为我提供更好的DDD体验吗?

domain-driven-design entity-framework lazy-loading

26
推荐指数
2
解决办法
1万
查看次数