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

本文关键字:构造函数 参数传递 子类 何使用 结构图 | 更新日期: 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