当使用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容器的适当情况。根据用户的行为,可以在应用程序的整个生命周期中用不同的产品(和计数)有规律地实例化订单,这表明需要为可能创建订单的每个上下文中配置一个容器——也就是说,为每个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();
}