Unity IoC и статический метод - PullRequest
       21

Unity IoC и статический метод

2 голосов
/ 02 февраля 2011

Каков наилучший способ справиться с ситуацией, когда вы используете IoC, но в нем есть статический метод наряду с другими методами, такими как следующие:

public partial class ShoppingCart
{
    private IDatabaseFactory _storeDB;

    public ShoppingCart(IDatabaseFactory storeDB)
    {
        _storeDB = storeDB;
    }

    private string ShoppingCartId { get; set; }

    public static ShoppingCart GetCart(HttpContextBase context)
    {
        var cart = new ShoppingCart(WHATGOESHERE?);
        cart.ShoppingCartId = cart.GetCartId(context);
        return cart;
    }

    public int OtherMethod()
    {
        ...
    }
}

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Статический метод 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.

0 голосов
/ 02 февраля 2011

IMO, вы должны реорганизовать его, чтобы он выглядел следующим образом:

public class ShoppingCartService {
    private readonly IDatabaseFactory _storeDB;

    public ShoppingCartService(IDatabaseFactory storeDB) {
        _storeDB = storeDB
    }

    public ShoppingCart GetCart(IdType cartId)
    {
        var cart = new ShoppingCart(_storeDB);
        cart.ShoppingCartId = cartId;
        return cart;
    }
}

public partial class ShoppingCart
{
    private IDatabaseFactory _storeDB;

    public ShoppingCart(IDatabaseFactory storeDB)
    {
        _storeDB = storeDB;
    }

    private string ShoppingCartId { get; set; }

    public int OtherMethod()
    {
        ...
    }
}

Таким образом, вы перекладываете ответственность за перевод текущей корзины покупок со статического метода на класс обслуживания, который можно внедритьслой представления.

...