3

構造マップを使用して、2つの異なる方法のいずれかで構成された同じ具象タイプを取得するにはどうすればよいですか?たとえば、あるインスタンスではユーザーキューをリッスンするように構成されたクラスがありますが、別のインスタンスではファシリティキュー用に構成されています。オブジェクトに関する他のすべては同じです。

コンストラクターで列挙型を受け入れるオブジェクトを作成しました。列挙型の値に基づいて、オブジェクトはファシリティキューまたはユーザーキューのいずれかをリッスンします。では、同じタイプの2つの異なる構成のオブジェクトを渡すように構造マップを構成するにはどうすればよいですか?クラスは私のインターフェースを実装しているので、次のようになります。

public class Configuration : IConfiguration {
    public Configuration(enum configType) {
        if (configType == enum.users) {
            /* code */
        } else if(configType == enum.facilities) {
            /* code */
        }
    }
}

次に、構成オブジェクトを2回受け入れるように親クラスをセットアップしようとしています。1回はファシリティ用に構成され、もう1回はユーザー用に構成されています。どうすればいいですか?2つのクラスのインスタンス名に基づいてそれを実行できるのではないかと思いましたが、これを実行する方法を説明している可能性のあるドキュメントや他の場所には何も見つかりません。親クラスは次のようになります。

public class Parent : IParent {
    public Parent(IConfiguration facilityConfig, IConfiguration userConfig) {
    }
}

したがって、親クラスでは、「facilityConfig」をenum.facilitiesが渡されたConfigurationのインスタンスにし、「userConfig」オブジェクトが同じConfigurationクラスのインスタンスになりますが、enum.usersが渡されます。私が求めていることが意味をなさないかどうか教えてください。

4

1 に答える 1

4

enumこの問題の解決策の1つは、値に基づいて切り替えを行うのではなく、2つの別個の構成クラスを使用することです。

IConfiguration次のように実装を定義できます。

public class UsersConfiguration : IConfiguration
{
    /* code for user */
}

public class FacilitiesConfiguration : IConfiguration
{
    /* code for facilities */
}

次に、コンテナー構成でCtor、コンストラクター引数を解決するタイプを指定できます。

var c = new StructureMap.Container();

c.Configure(x =>
    {
        x.For<IParent>().Use<Parent>()
            .Ctor<IConfiguration>("facilityConfig").Is<FacilitiesConfiguration>()
            .Ctor<IConfiguration>("userConfig").Is<UsersConfiguration>();
    });

この登録後、IParentインスタンスを作成できます。

var p = c.GetInstance<IParent>();

2つの依存関係がコンテナによって正しく設定されていることに注意してください。


アップデート:

の異なる実装に問題がある場合は、StructureMapに:IConfigurationをインスタンス化する方法を正確に伝えることができます。Parent

var c = new Container(x =>
{
    x.For<IParent>().UseSpecial(i => i.ConstructedBy(ConstructParent));
});

ConstructParent()メソッドは次のように定義できます。

private static IParent ConstructParent()
{
    return new Parent(
                new Configuration(ConfigType.facilities),
                new Configuration(ConfigType.users));
}

必要に応じて、これをすべて1回のショットで実行できます。

var c = new Container(x =>
{
    x.For<IParent>().UseSpecial(i => i.ConstructedBy(
        _ => new Parent(
            new Configuration(ConfigType.facilities),
            new Configuration(ConfigType.users))));
});

ただし、このような場合(「この1つの構成値を除いてまったく同じ」)、基本(おそらく抽象)クラスで共通の定義を抽出し、異なる構成値のみを定義する2つの派生物を使用したいと思います。

于 2012-12-13T21:38:33.420 に答える