Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一与静态法_C#_Unity Container_Ioc Container_Ninject - Fatal编程技术网

C# 统一与静态法

C# 统一与静态法,c#,unity-container,ioc-container,ninject,C#,Unity Container,Ioc Container,Ninject,在使用IoC的情况下,最好的处理方法是什么,其中包含一个静态方法以及其他方法,如: public partial class ShoppingCart { private IDatabaseFactory _storeDB; public ShoppingCart(IDatabaseFactory storeDB) { _storeDB = storeDB; } private string ShoppingCartId { get;

在使用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()
    {
        ...
    }
}

在我看来,您应该重构它,使其看起来像这样:

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()
    {
        ...
    }
}

通过这种方式,您可以将获取当前购物车的责任从静态方法转移到可以注入表示层的服务类。

静态
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。

为什么您的
HttpContext
被传递到DAL层?我正在处理一个示例中的片段。正如Daniel a White所指出的,这是一个坏主意。国际奥委会有时倾向于揭露这样的坏想法。