当使用IoC容器时,如何将动态数据/对象传递给类

本文关键字:数据 动态 对象 IoC | 更新日期: 2023-09-27 18:10:03

我有一个Order类,构造函数如下

public Order(IProduct product, short count)
{
this._product = product;
this._count = count;
}

我正在尝试设置Unity IoC容器,显然要构建订单对象,我需要知道计数和产品,但这些是在运行时确定的;计数可以是任何值,产品可以是任何产品,例如胡萝卜,甜瓜等。

那么如何为此应用IoC呢?

我想到的一种方法是,我的构造函数只接受对象依赖关系,然后使用一个新的Initialize()方法添加任何其他必需的属性:

public Order (IProduct product)
{
this._product = product;
}
public Initialize(short count)
{
this._count = count;
}

以这种方式,无论谁创建Order对象,都必须在之后调用Initialize()方法,以便将IoC容器不能处理的其他属性添加到它。

这是你推荐/使用的方法吗?

当使用IoC容器时,如何将动态数据/对象传递给类

对我来说,这似乎不是IoC容器的适当情况。根据用户的行为,可以在应用程序的整个生命周期中用不同的产品(和计数)有规律地实例化订单,这表明需要为可能创建订单的每个上下文中配置一个容器——也就是说,为每个Product页面配置一个容器。

当您可以在很少和早期(例如在应用程序启动时)对依赖项做出决策时,IoC容器工作得最好。如果决定注入哪个依赖总是在创建依赖对象的同时进行,那么IoC容器只会增加不必要的复杂性。

使用Unity,你应该能够设置一个ParameterOverride来传递你的额外参数:

container.Resolve<IOrder>(new ParameterOverrides { { "Count", 1 } });

好的,或者创建一个工厂类:

class OrderFactory : IOrderFactory
{
    public OrderFactory ( IProduct product );
    public Order GetOrder (count)
    {
        return new Order ( product, count );
    }
}

使用容器解析工厂。然后使用工厂来解决您的订单。

Count应该只是Order的一个属性。计数代表什么?订单数量还是产品数量?我不太确定你打算如何在这里实现和IoC容器。

像这样:

public class Order
{
  private IProduct _product;
  public Order(IProduct product)
  {
    _product = product;
  }
  public int Count {get;set;}
}

@scottm这是我在aspx页面中的实际代码:

private IStoresRankingReportPresenter _presenter;
     protected void Page_Init(object sender, EventArgs e)
            {
                this._presenter = ServiceLocator.Current.GetInstance<IStoresRankingReportPresenter>();
                this._presenter.Initialize(this, this.Count);
                this._presenter.OnPageInit();
            }