Я согласен с Полом Стовеллом, похоже, пользователь должен владеть корзиной. Но, во всяком случае, к тому времени, когда ваш конструктор вызывается, у вас уже есть новый экземпляр Cart. C # не позволяет вам изменять ссылку, возвращаемую конструктором, поэтому вместо того, чтобы клиенты класса Cart, использующие конструктор, должны вызывать статический метод фабрики (у меня нет опыта работы с Linq to SQL, поэтому это может не сработать) непосредственно).
Ваш метод GetCurrentCart почти такой; вам просто нужно пометить его как статическое. Кроме того, вы должны сделать так, чтобы конструктор Cart отвечал только за создание новой корзины, и сделать ее частной, чтобы клиенты были вынуждены использовать 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;
}
}