Статический метод GetCart
представляет собой Окружающий контекст .Это плохая идея, особенно иметь такой метод на уровне модели вашего домена.Попробуйте изменить рефакторинг на абстрактную фабрику:
public interface IShoppingCartFactory
{
ShoppingCart GetCartForCurrentUser();
}
Вы можете внедрить IShoppingCartFactory
в сервисы, которые в этом нуждаются (но не в ваших объектах, лучше поддерживать их в чистоте).Теперь вы можете определить реализацию и зарегистрировать ее в своей конфигурации IoC.Вот пример такой реализации:
public class HttpShoppingCartFactory : IShoppingCartFactory
{
private readonly IShoppingUnitOfWorkFactory uowFactory;
public HttpShoppingCartFactory(
IShoppingUnitOfWorkFactory uowFactory)
{
this.uowFactory = uowFactory;
}
public ShoppingCart GetCartForCurrentUser()
{
int userId = (int)HttpContext.Current.Session["userId"];
using (var unitOfWork = this.uowFactory.CreateNew())
{
return unitOfWork.ShoppingCards
.FirstOrDefault(c => c.User.Id == userId);
}
}
}
Было бы еще лучше отделить получение пользовательского контекста от фабрики карт покупок.Например, вы вводите IUserContextFactory
на фабрике карточек покупок, что делает его независимым от ASP.NET.