gpt4 book ai didi

design-patterns - 每个实体一项服务?

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

再次 - 我对 DDD 的事情感到困惑 :)

我有架构(我仍在研究它),简而言之,它看起来像这样:

DataLayer:
EntityDao -> Implementing domain layer interfaces (NHibernate)
DomainLayer:
EntityRepository -> Repository for each entity with injected Dao
DomainObjects/Entitys -> Some logic
UI
ASP.Net MVC

我现在正处于创建和使用一些服务类的那个点。我对此有一些疑问:

1.我应该为每个实体/域对象创建至少一项服务吗?

2.a.服务是否应该有“查询”方法,如 Find、FIndAll、FindAll(LINQQuery)?

2.b.我是否应该停止使用上层(UI)中的存储库来获取实体集(“查找”类方法)并开始仅使用服务?

3.如果对 2 个问题的回答是否定的 - 我是否应该以并行方式使用服务和存储库(在 UI 中我只需要获取所有实体我使用 Repository.FindAll,当我需要获取该实体的一些“逻辑”列表时)使用 Service.FindXXX 方法)?

4.不知何故,我觉得存储库不适合域层-我应该以某种方式将它们分开并且在域中只留下特定于域的对象,例如实体和服务吗?如果是 - 给我一些结构示例如何实现这一点。

一些对象的例子:

道:
public class NHibernateDao<T> : IDao<T>
{
public NHibernateDao() { }

public T Get(object id)
{
T entity = (T)NHibernateSession.Get(entityType, id);
return entity;
}
public T Load(object id)
{
T entity = (T)NHibernateSession.Load(entityType, id);
return entity;
}
public virtual T Update(T entity)
{
NHibernateSession.Update(entity);
return entity;
}
...

存储库:
public class BaseRepository<T>:IRepository<T>
{
private DataInterfaces.IDao<T> mDao;

public virtual T Get(object id)
{
return mDao.Get(id);
}
public virtual void Delete(T entity)
{
mDao.Delete(entity);
}
public virtual T Update(T entity)
{
return mDao.Update(entity);
}
public virtual IQueryable<T> FindAll()
{
return mDao.FindAll();
}
...

领域对象,目前主要是 get/set 容器 - 这个问题的背景是删除那个贫血模型。

最佳答案

1. 每个实体一项服务?

不,您不需要为一个实体创建一项服务。
在 DDD 中,您将为不会自然映射到单个实体(或值对象)的操作创建服务。良好的服务(来自 Evans ):

  • 该操作涉及不是实体或值对象的自然部分的域概念。
  • 接口(interface)是根据域的元素定义的。
  • 操作无状态

  • 因此,一个服务可以使用许多实体,并且可能有许多实体根本不被单个服务使用。

    2a.服务应该有“查询”方法(..)吗?

    不。一般来说,这些是存储库方法,而不是放在服务上。但是,可以对返回实体集合的服务进行操作。

    2b.我是否应该停止使用上层(UI)中的存储库来获取实体集(“查找”类方法)并开始仅使用服务?

    这可能是个好主意。通常,当应用程序在 UI 层中使用许多存储库时,UI 会对多个实体执行域操作。这些操作通常应该在领域层实现;在实体本身或服务中。

    3. 我应该从 UI 中并行使用服务和存储库吗?

    最好不要,见上文;尽管在某些情况下您可以通过这样做快速创建部分 UI。

    4.不知何故,我觉得存储库不适合域层......

    没错,您应该只将存储库接口(interface)放在域中。有关示例,请参见 Kostassoid 的答案。

    关于design-patterns - 每个实体一项服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6606205/

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