【问题标题】:NHibernate: Is it okay to manipulate the repository directly from my entity classes?NHibernate:可以直接从我的实体类操作存储库吗?
【发布时间】:2012-05-17 21:01:10
【问题描述】:

我有一个通过 Fluent NHibernate 的 AutoPersistenceModel 使用 NHibernate 的自定义存储库实现。

我有一堆实体类,我坚持使用这个存储库。

问题是,是否可以将真正的业务逻辑放在这些实体类中?

如果某些业务逻辑需要操作存储库本身,是否还可以?
(例如,某些方法需要创建一些新实体,其中一些需要更新现有实体等。 )

我知道 NHibernate 具有强大的持久性无知功能,但我仍然不确定这个细节。提前感谢您的回答!

【问题讨论】:

    标签: .net nhibernate fluent-nhibernate repository repository-pattern


    【解决方案1】:

    Logic w.r.t Entity 应该被限制在它的“业务领域”。 更新实体中的其他实体/基础设施是一个非常糟糕的想法/设计。

    Order --> OrderLines
    Order {OrderId, OrderDate, Customer, OrderLines, ...}
    OrderLines {OrderLineId, Order, Item, Price, Quantity, Deliveries, DeliveredQuantity, ...}
    
    OrderDelivery --> OrderDeliveryLines
    OrderDelivery {OrderDeliveryId, Customer, DeliveryDate, ...}
    OrderDeliveryLines {OrderDeliveryLineId, OrderDelivery, OrderLine, DeliveryQuantity, ....}
    

    orderLine 的交付数量是针对它进行的所有交付的总和。

    因此,在上述情况下,通过订单(即订单流程)创建/更新交付是错误的,交付的交付线将根据交付数量(在交付流程内)对应的订单线进行。

    当明确定义事务边界时,您将永远不会要求流程逻辑潜入您的“业务领域”

    http://domaindrivendesign.org/

    【讨论】:

    • 这太棒了,但我不能使用我用作实体的类作为我的域对象吗?
    • 是的,你当然应该这样做,如果不这样做,那么它将破坏将业务功能映射到域的整个目的。
    • 那么,如果我的域需要操作存储库,并且我想将我的域对象用作实体,那该怎么办?
    • 我不确定我是否跟随你,你的陈述“域需要操作存储库,我想使用域对象作为实体”,如前所述 存储库的责任是数据访问并在需要时保持持久性。 最好发布实际代码,这样上下文会更清晰
    • 没有太多要讲的了。我有一堆类,我想同时用作域对象实体类。我知道仓库的职责是什么,问题和它没有太大关系。
    猜你喜欢
    • 2010-10-24
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多