gpt4 book ai didi

domain-driven-design - 规范模式对象应该在哪一层 "new' 编辑”?

转载 作者:行者123 更新时间:2023-12-04 10:28:47 24 4
gpt4 key购买 nike

所以,我在这里查看了一些关于规范模式的帖子,但还没有找到答案。

我的问题是,在 n 层架构中,规范究竟应该在哪里“更新”?

  • 我可以将它们放在我的服务层(又名,有时称为应用程序层......基本上,一个 .aspx 代码隐藏会与之交谈的东西),但我觉得这样做,我让业务规则泄露出去域。如果通过其他方式访问域对象(除了服务层),域对象就不能强制执行它们自己的业务规则。
  • 我可以通过构造函数注入(inject)将规范注入(inject)我的模型类。但同样,这感觉是“错误的”。我觉得应该注入(inject)模型类的唯一东西是“服务”,如缓存、日志记录、脏标志跟踪等......如果你能避免它,使用 Aspects 而不是乱扔模型的构造函数具有大量服务接口(interface)的类。
  • 我可以通过方法注入(inject)(有时称为“双重调度”???)注入(inject)规范,并明确地让该方法封装注入(inject)的规范以强制执行其业务规则。
  • 创建一个“域服务”类,它将通过构造函数注入(inject)获取规范,然后让服务层使用域服务来协调域对象。这对我来说似乎没问题,因为规范强制执行的规则仍然在“域”中,并且域服务类的命名非常类似于它正在协调的域对象。这里的事情是我觉得我正在编写很多类和代码,只是为了“正确”实现规范模式。

  • 除此之外,有问题的规范需要一个存储库才能确定它是否“满意”。

    这可能会导致性能问题,尤其是。如果我使用构造函数注入(inject) b/c 消费代码可以调用一个可能包装规范的属性,而这反过来又调用了数据库。

    那么有什么想法/想法/文章链接吗?

    新建和使用规范的最佳地点在哪里?

    最佳答案

    简短回答:

    您主要在服务层中使用规范,所以在那里。

    长答案:
    首先,这里有两个问题:

    您的规范应该放在哪里,它们应该在哪里更新?

    就像您的存储库接口(interface)一样,您的规范应该存在于域层中,因为它们毕竟是特定于域的。有一个question on SO在存储库接口(interface)上讨论了这一点。

    他们应该在哪里更新呢?好吧,我用 LinqSpecs在我的存储库中,并且大多数时候在我的存储库中有三种方法:

    public interface ILinqSpecsRepository<T>
    {
    IEnumerable<T> FindAll(Specification<T> specification);
    IEnumerable<T> FindAll<TRelated>(Specification<T> specification, Expression<Func<T, TRelated>> fetchExpression);
    T FindOne(Specification<T> specification);
    }

    我的其余查询是在我的服务层中构建的。这可以防止存储库因 GetUserByEmail、GetUserById、GetUserByStatus 等方法而变得臃肿。
    在我的服务中,我更新了我的规范并将它们传递给我的存储库的 FindAll 或 FindOne 方法。例如:
    public User GetUserByEmail(string email)
    {
    var withEmail = new UserByEmail(email); // the specification
    return userRepository.FindOne(withEmail);
    }

    这是规范:
    public class UserByEmail : Specification<User>
    {
    private readonly string email;

    public UserByEmail(string email)
    {
    this.email = email;
    }

    #region Overrides of Specification<User>

    public override Expression<Func<User, bool>> IsSatisfiedBy()
    {
    return x => x.Email == email;
    }

    #endregion
    }

    因此,为了回答您的问题,规范在服务层(在我的书中)是新的。

    I feel like the only thing that should be injected into Model classes are "services"



    IMO 你不应该向域实体注入(inject)任何东西。

    Add to this, that the Specification in question requires a Repository in order to determine whether it's "satisfied" or not.



    那是 code smell .我会在那里查看您的代码。规范绝对不应该需要存储库。

    关于domain-driven-design - 规范模式对象应该在哪一层 "new' 编辑”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234068/

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