【发布时间】:2010-06-08 15:12:05
【问题描述】:
我正在测试将 NHibernate 与一个完全不了解它并且不打算适应任何限制的域一起使用是多么困难。
在我在网络上发现的许多示例中,被映射的域是贫血域的又一个示例,其中对象与简单的数据持有者相差不远。当然,这使得映射变得简单,而且它可能会吸引以数据为中心的人/情况,但我不喜欢听到我脑海中的声音说“C 也有结构,你知道吗?”,“类不是只是花哨的命名空间,你知道吗?”,或者“你为什么不使用 CREATE TABLE 来代替?”。
但回到 NHibernate。 NHibernate 迫使我将属性设为虚拟,以便能够代理它们以进行延迟加载。这是我不介意的,因为我可能也需要它们作为一些 AOP 东西的虚拟。 我不满意的限制是需要一个空的构造函数和需要设置器/属性。我希望我的实体以有效状态创建,并且大多数时候这意味着没有空的构造函数。 出于通常的原因,我也不想公开集合属性的设置器。哦,还有不应该直接更改的属性的设置器。
在某处的领域模型中考虑这种简化和人为的聚合:
public class ShoppingCartItem
{
private readonly Product product;
public ShoppingCartItem(Product product, int quantity)
{
if(quantity <= 0)
throw new ArgumentOutOfRangeException("quantity");
this.product = product;
this.quantity = quantity;
}
public virtual Product Product
{
get { return product; }
}
private int quantity;
public virtual int Quantity
{
get { return quantity; }
set
{
if(value <= 0)
throw new ArgumentOutOfRangeException("value");
quantity = value;
}
public virtual Money TotalPrice
{
get { return product.Price * quantity; }
}
}
public class ShoppingCart : Entity
{
private readonly IDictionary<Product, ShoppingCartItem> items =
new Dictionary<Product, ShoppingCartItem>();
private readonly ISet<DiscountCoupon> discountCoupons =
new HashSet<DiscountCoupon>();
public virtual IEnumerable<ShoppingCartItem> Items
{
get { return items.Values; }
}
public virtual IEnumerable<DiscountCoupon> DiscountCoupons
{
get { return discountCoupons; }
}
public virtual void AddProduct(Product product)
{
ShoppingCartItem item;
if(items.TryGetValue(product, out item))
item.Quantity++;
else
items.Add(product, new ShoppingCartItem(product, 1));
}
public virtual void RemoveProduct(Product product)
{
ShoppingCartItem item;
if(!items.TryGetValue(product, out item))
throw new ArgumentException("product");
if(item.Quantity == 1)
items.Remove(product);
else
item.Quantity--;
}
public virtual int AddDiscountCoupon(DiscountCoupon coupon)
{
discountCoupons.Add(coupon);
}
public virtual int RemoveDiscountCoupon(DiscountCoupon coupon)
{
discountCoupons.Remove(coupon);
}
public virtual Money CalculatePrice()
{
// Missing complex discount logic
return items.Values.Sum(item => item.TotalPrice);
}
}
大多数属性没有设置器,也没有空的构造函数。集合不是直接干预的,而是通过专门的方法干预的。我可以利用 NHibernate 的可扩展性来映射它吗?还是我想再次敲一个螺丝?还是两者兼有?
【问题讨论】:
标签: nhibernate orm nhibernate-mapping mapping