gpt4 book ai didi

NHibernate 映射没有空的构造函数和 setter

转载 作者:行者123 更新时间:2023-12-01 07:47:33 25 4
gpt4 key购买 nike

我正在测试将 NHibernate 与完全不知道它的域一起使用是多么困难,并且不倾向于适应任何限制。

在我在网络上发现的许多示例中,被映射的域是贫血域的又一个示例,其中对象与简单的数据持有者相差不远。当然,这使得映射变得简单,它可能会吸引以数据为中心的人/情况,但我不喜欢听到我脑海中的声音说“C 也有结构,你知道吗?”,“类不是只是花哨的命名空间,你知道吗?”,或者“你为什么不使用 CREATE TABLE 来代替?”。

但回到 NHibernate。 NHibernate 迫使我将属性设为虚拟,以便能够代理它们以进行延迟加载。这是我不介意的,因为我可能也需要它们作为一些 AOP 东西的虚拟。
我不满意的限制是需要一个空的构造函数和需要 setter /属性。我希望我的实体以有效状态创建,并且大多数时候这意味着没有空的构造函数。
出于通常的原因,我也不想公开集合属性的 setter 。哦,还有不应该直接更改的属性的 setter 。

在某处的领域模型中考虑这个简化和人为的聚合:

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);
}
}

大多数属性没有 setter ,也没有空的构造函数。集合不是直接干预的,而是通过专门的方法干预的。我可以利用 NHibernate 的可扩展性来映射它吗?还是我想再次敲一个螺丝?或两者?

最佳答案

好吧,您可以将私有(private)/内部/ protected setter 放在属性/集合上,并且 nhibernate 将正确加载它们(第 4.1.1 章)

构造函数在那里,但您没有义务将其公开(第 4.1.2 章)

最新章节引用 http://sourceforge.net/projects/nhibernate/files/NHibernate/2.1.2GA/NHibernate-2.1.2.GA-reference.zip/download

关于NHibernate 映射没有空的构造函数和 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2998628/

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