接口:
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
。
答案 0 :(得分:2)
使用命名实例,您可以根据输入创建不同的对象:
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
。