7

重要; 私は本当にStructureMapここで答えを探しています。Windsor、Spring、Unity、またはその他のいずれかでそれを行う方法を言わないでください。

私はStructureMapIoCで遊んでいます-そして基本的に私の目的は、コアタイプを定義する「デフォルト」プロファイルと、これをオーバーライド/拡張​​する多くの名前付きプロファイルを持つことです。プロファイルはこれを行うことができると思いますが、xml またはコード API を介して機能させることはできません。特に、プロファイルのコンテナーをロードしようとすると:

container = new Container();
container.SetDefaultsToProfile(profile);

CreateProfile次に、(その名前で) 初期化を明確に呼び出したにもかかわらず、「要求されたプロファイル {name} が見つかりません」というメッセージが表示されます。

私は間違った木を吠えていますか?

( user-groupにも投稿)


私が理想的に望んでいるのは、標準(/default) タイプを定義してから、さまざまな名前付き構成の範囲で、いくつかの設定をオーバーライドできるようにすることです。

  • グローバル: IFoo=> FooIBar=>Bar
  • configA: (変更なし)
  • configB: IFoo=>SpecialFoo

これは、名前付きプロファイルを使用してロードされた 2 つのコンテナーにマップできると思います。目的は、いずれかのコンテナに を要求すると、 -IBarを取得し ますが、configA は(for ) を返し、configB は を返します 。BarFooIFooSpecialFoo

誰かがこれを設定する方法を教えてもらえますか? xml とコードのどちらでもかまいません...動作させたいだけです。必要なのは、インターフェイスから具象型へのマッピングだけです (特別な構成/プロパティ設定は必要ありません)。

4

2 に答える 2

9

秘訣は、すべてのプロファイルが少なくともその中で定義されているルールであることを確認することです。ルール(configA)を指定しない場合、プロファイルは作成/表示されません。

これらのクラスを考えると:

public interface IFoo { string SayHello(); }
public class Foo : IFoo { public string SayHello() { return "Hello"; } }
public class SpecialFoo : IFoo { public string SayHello() { return "Hello Special"; } }

public interface IBar { }
public class Bar : IBar { }

public interface IDummy { }
public class Dummy : IDummy{ }

このレジストリを定義できます。

public class MyRegistry : Registry
{
    protected override void configure()
    {
        ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar>();
        ForRequestedType<IFoo>().TheDefault.Is.OfConcreteType<Foo>();
        CreateProfileNotEmpty("configA");
        CreateProfileNotEmpty("configB")
            .For<IFoo>().UseConcreteType<SpecialFoo>();
    }
    StructureMap.Configuration.DSL.Expressions.ProfileExpression CreateProfileNotEmpty(string profile)
    {
        return CreateProfile(profile)
            .For<IDummy>().UseConcreteType<Dummy>();
    }
}

そしてそれはこれらのテストで動作します:

[TestMethod]
public void TestMethod1()
{
    var container = new Container(new MyRegistry());
    Assert.IsNotNull(container.GetInstance<IBar>());
    Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello());

    container.SetDefaultsToProfile("configB");
    Assert.IsNotNull(container.GetInstance<IBar>());
    Assert.AreEqual("Hello Special", container.GetInstance<IFoo>().SayHello());

    container.SetDefaultsToProfile("configA");
    Assert.IsNotNull(container.GetInstance<IBar>());
    Assert.AreEqual("Hello", container.GetInstance<IFoo>().SayHello());
}

CreateProfileNotEmptyを単純なCreateProfileに置き換えると、デフォルトをconfigAに設定する行で失敗します。

于 2009-02-25T18:45:30.997 に答える
1

このビデオを見てください。彼は、「デフォルト」プロファイルを実行し、バリエーションとして機能する他の名前付きプロファイルを持つ別の方法を示しています。

http://www.dimecasts.net/Casts/CastDetails/135

于 2009-09-29T20:56:14.227 に答える