0

界面:

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

4

1 回答 1

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.

于 2013-09-14T11:23:36.897 回答