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)
    {
    }
}

しかし、構造マップでは、1 つのオプションだけで処理できるようです。

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 に答える