如何使用structuremap将父/子类作为构造函数参数传递?

时间:2013-09-13 10:18:05

标签: c# design-patterns inversion-of-control structuremap

接口:

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

1 个答案:

答案 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