我有一个带有以下构造函数的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容器无法处理的其他属性添加到其中。
这是您推荐/使用的方法吗?
答案 0 :(得分:6)
对我来说,这对IoC容器来说似乎不合适。根据用户的行为,推测订单可以在应用程序的整个生命周期中定期使用不同的产品(和计数)进行实例化,这表明需要为可能创建订单的每个上下文配置容器 - 也就是说,每个产品页面。
IoC容器在您很少和早期就可以在应用程序启动时做出有关依赖关系的决策时效果最佳。如果决定注入哪个依赖项总是在创建依赖对象的同时进行,那么IoC容器只会增加不必要的复杂性。
答案 1 :(得分:1)
使用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 );
}
}
使用容器解析工厂。然后使用工厂解决您的订单。
答案 2 :(得分:0)
Count应该只是Order的属性。伯爵代表什么?订单行数或产品数量?我不太确定你在这里如何计划实施和IoC容器。
这样的事情:
public class Order
{
private IProduct _product;
public Order(IProduct product)
{
_product = product;
}
public int Count {get;set;}
}
答案 3 :(得分:0)
@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();
}