代码之家  ›  专栏  ›  技术社区  ›  jlembke

获取域实体的其他数据

  •  2
  • jlembke  · 技术社区  · 16 年前

    3 回复  |  直到 16 年前
        1
  •  5
  •   Mike Scott    16 年前

    在这种情况下,即添加额外行项目的作用。您可以通过为此角色创建一个接口和一个具有该角色内部支持的相应聚合来实现这一点。

    例如:

    public interface IOrder
    {
      IList<LineItem> LineItems { get; }
      // ... other core order "stuff"
    }
    
    public interface IAddItemsToOrder: IOrder
    {
      void AddItem( LineItem item );
    }
    
    public interface IOrderRepository
    {
      T Get<T>( int orderId ) where T: IOrder;
    }
    

    public class CartService
    {
      public void AddItemToOrder( int orderId, LineItem item )
      {
        var order = orderRepository.Get<IAddItemsToOrder>( orderId );
        order.AddItem( item );
      }
    }
    

    IAddItemsToOrder 需要一个客户实体,以便它可以检查信用余额。因此,您只需通过定义特定接口来级联相同的技术。订单存储库可以调用客户存储库来返回一个满足该角色的客户实体,并将其添加到订单聚合中。

    这样你就有了基础 ICustomer 接口,然后以 ICustomerCreditBalance 既充当Customer存储库的标记接口,告诉它您需要客户做什么,这样它就可以创建适当的客户实体,并且它具有支持特定角色的方法和/或属性。类似于:

    public interface ICustomer
    {
      string Name { get; }
      // core customer stuff
    }
    
    public interface ICustomerCreditBalance: ICustomer
    {
      public decimal CreditBalance { get; }
    }
    
    public interface ICustomerRepository
    {
      T Get<T>( int customerId ) where T: ICustomer;
    }
    

    显式的角色接口为存储库提供了所需的关键信息,以便正确决定从数据库中获取哪些数据,以及是主动还是被动地获取。

    请注意,我已经把 CreditBalance 在这种情况下,接口。然而,它也可以在基地上 IC客户信用余额

    正如您在问题中提到的,将这一切结合在一起的最后一部分是域事件。如果超过客户的信用余额,订单可以引发故障域事件,通知服务层订单无效。另一方面,如果客户有足够的信用,它可以更新客户对象上的余额,也可以引发域事件,通知系统的其他部分需要减少余额。

    我尚未将域事件代码添加到 CartService

        2
  •  2
  •   Kevin Swiber    16 年前

    Predicate<T> 这用于确定客户的信用额度是否足以处理订单行。

    public class Order
    {
        public Predicate<decimal> CanAddOrderLine;
    
        // more Order class stuff here...
    
        public void AddOrderLine(OrderLine orderLine)
        {
            if (CanAddOrderLine(orderLine.Amount))
            {
                OrderLines.Add(orderLine);
                Console.WriteLine("Added {0}", orderLine.Amount);
            }
            else
            {
                Console.WriteLine(
                    "Cannot add order.  Customer credit line too small.");
            }
        }
    }
    

    // App code.
    var customerService = new CustomerService();
    var customer = new Customer();
    var order = new Order();
    order.CanAddOrderLine = 
        amount => customerService.GetAvailableCredit(customer) >= amount;
    
    order.AddOrderLine(new OrderLine { Amount = 5m });
    customerService.DecrementCredit(5m);
    

    毫无疑问,你的真实情况会比这更复杂。您可能还想查看 Func<T>

        3
  •  1
  •   Vijay Patel    16 年前

    锁定含义

    如果“池”不断变化,那么在您的规则通过后,但在您将更改提交到数据库之前,是否有可能有其他人的事务悄悄进入?

    推荐文章