如何使用结构图将父/子类作为构造函数参数传递
本文关键字:构造函数 参数传递 子类 何使用 结构图 | 更新日期: 2023-09-27 18:31:07
接口:
public interface IPricingFactorsRepository
{
IList<LrfInputRates> GetLeaseRateFactorList(
string programCode,
string countryCode,
string currencyCode,
string leaseTerm);
}
在派生/实现类下面:
public class PricingFactorsRepository : IPricingFactorsRepository
{
}
public class OverridePricingFactorsRepository : PricingFactorsRepository
{
}
在外面,有这样一个类接受接口作为构造函数参数:
public class PricingHandler
{
public PricingHandler(IPricingFactorRepository pricingFactorRepository)
{
}
}
但是使用结构图,似乎我只能用一个选项来处理它:
x.For<IPricingFactorsRepository>().Use<PricingFactorsRepository>();
在某些情况下,我希望传入的参数是PricingFactorsRepository
的实例,有时,它应该是OverridePricingFactorsRepository
的。
使用命名实例,您可以根据输入创建不同的对象:
ObjectFactory.Initialize(conf =>
{
conf.For<IPricingFactorsRepository>().Use<PricingFactorsRepository>();
conf.For<PricingHandler>().Use<PricingHandler>().Named("Default");
conf.For<PricingHandler>().Add<PricingHandler>().Named("Overriding")
.Ctor<IPricingFactorsRepository>().Is<OverridePricingFactorsRepository>();
});
现在,您可以按名称获取不同的处理程序配置。默认值是带有 PricingFactorsRepository
.
var ph = ObjectFactory.GetInstance<PricingHandler>();
var oph = ObjectFactory.GetNamedInstance<PricingHandler>("Overriding");
您希望将其与工厂方法相结合,其中依赖于定价处理程序的对象将根据用户输入获取不同的变体。
public class PricingHandlerFactory
{
public PricingHandlerFactory(IContainer container)
{
_container = container;
}
public PricingHandler Create(string type)
{
var instance = ObjectFactory.TryGetInstance<PricingHandler>(type);
return instance ?? ObjectFactory.GetInstance<PricingHandler>();
}
}
在你需要的地方注入 PricingHandlerFactory(Structuremap 会自动连接它,所以应该不需要配置它)并使用用户输入调用 Create
方法来获取PricingHandler
。