我正在扩展(不确定这里是否是正确的词)在Linq to SQL数据库模型中生成的部分Cart类。
业务逻辑是每个客户只能有一个购物车。如果客户没有购物车,则应该创建;如果客户有购物车,则应退回。
这就是我正在做的事情:
public partial class Cart
{
//the rest of the Cart class is in the .dbml file created by L2S
public Cart(int userId)
{
Cart c = GetCurrentCart(userId);
this.CartId = c.CartId ;
this.UserId = c.UserId;
}
public Cart GetCurrentCart(int userId)
{
Cart currentCart = new Cart();
// if cart exists - get it from DB
//if not - create it, save in DB, and get if right out
//all of this is done with Linq to SQL
return currentCart;
}
}
从构造函数中调用方法似乎不对。我是否以正确的方式执行业务逻辑?
答案 0 :(得分:8)
我想问为什么“购物车”课程如此聪明。在域驱动设计术语中,听起来像用户“拥有”购物车。那么为什么不能这样:
var user = // Load a user
var cart = user.Cart;
在这种情况下,您的购物车吸气剂可能会懒洋洋地加载/初始化购物车。
答案 1 :(得分:5)
我同意Paul Stovell的观点,听起来用户应该拥有购物车。但无论如何,当你的构造函数被调用时,你已经有了一个新的Cart实例。 C#不允许你改变构造函数返回的引用,所以使用构造函数的Cart类的客户端应该调用静态工厂方法(我没有使用Linq to SQL的经验,所以这可能不起作用直接地)。
你的GetCurrentCart方法几乎就是这样;你只需要将它标记为静态。此外,您应该让Cart构造函数负责创建一个新的Cart并将其设置为private,以便客户端被迫使用GetCurrentCart。实现可能如下所示:
public partial class Cart
{
// Make a new cart
private Cart(int userId, int cartId)
{
this.CartId = userId;
this.UserId = cartId;
}
private static Dictionary<int, Cart> CurrentCarts = new Dictionary<int, Cart>();
public static Cart GetCurrentCart(int userId)
{
// TODO: Use a proper caching mechanism that will at least
// remove old carts from the dictionary.
Cart cart;
if (CurrentCarts.TryGetValue(userId, out cart))
{
return cart;
}
cart = /* try get cart from DB */;
if (cart == null)
{
// Make a new cart
cart = new Cart(userId, GenerateCartId());
}
CurrentCarts[userId] = cart;
return cart;
}
}