2011-09-21 9 views
1

次のような動作を説明できる人はいませんか?Structuremap、デフォルトのインスタンスと名前付きインスタンスを使用する場合の奇妙な動作オプション

特にTestUseAndAddが失敗したときにTestInitializeAndConfigure_Failsが失敗し、TestUseOrderChangedが失敗した場合にTestUse_Failsが失敗する理由を教えてください。使用<を呼び出すため

おかげ

コード

interface IResource {} 
class TheFirstResource : IResource {} 
class TheSecondResource : IResource {} 

[TestFixture] 
class Test 
{ 
    [Test] 
    public void TestUse_Fails() 
    { 
     ObjectFactory.Initialize(init => 
     { 
      init.For<IResource>().Singleton().Use<TheFirstResource>(); 
      init.For<IResource>().Singleton().Use<TheSecondResource>().Named("test"); 
     }); 

     IResource r1 = ObjectFactory.GetInstance<IResource>(); 
     IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test"); 

     Console.WriteLine(string.Format("TestUse_Fails \n{0}\n{1}", r1, r2)); 
    } 

    [Test] 
    public void TestUseOrderChanged() 
    { 
     ObjectFactory.Initialize(init => 
     { 
      init.For<IResource>().Singleton().Use<TheSecondResource>().Named("test"); 
      init.For<IResource>().Singleton().Use<TheFirstResource>(); 
     }); 

     IResource r1 = ObjectFactory.GetInstance<IResource>(); 
     IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test"); 

     Console.WriteLine(string.Format("TestUseOrderChanged \n{0}\n{1}", r1, r2)); 
    } 

    [Test] 
    public void TestUseAndAdd() 
    { 
     ObjectFactory.Initialize(init => 
     { 
      init.For<IResource>().Singleton().Use<TheFirstResource>(); 
      init.For<IResource>().Singleton().Add<TheSecondResource>().Named("test"); 
     }); 

     IResource r1 = ObjectFactory.GetInstance<IResource>(); 
     IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test"); 

     Console.WriteLine(string.Format("TestUseAndAdd \n{0}\n{1}", r1, r2)); 
    } 

    [Test] 
    public void TestInitializeAndConfigure_Fails() 
    { 
     ObjectFactory.Initialize(init => 
     { 
      init.For<IResource>().Singleton().Use<TheFirstResource>(); 
     }); 

     ObjectFactory.Configure(init => 
     { 
      init.For<IResource>().Singleton().Add<TheSecondResource>().Named("test"); 
     }); 

     IResource r1 = ObjectFactory.GetInstance<IResource>(); 
     IResource r2 = ObjectFactory.GetNamedInstance<IResource>("test"); 

     Console.WriteLine(string.Format("TestInitializeAndConfigure_Fails \n{0}\n{1}", r1, r2)); 
    } 
} 

出力

TestUse_Fails 
Smtesting.TheSecondResource 
Smtesting.TheSecondResource 

TestUseOrderChanged 
Smtesting.TheFirstResource 
Smtesting.TheSecondResource 

TestInitializeAndConfigure_Fails 
Smtesting.TheSecondResource 
Smtesting.TheSecondResource 

TestUseAndAdd 
Smtesting.TheFirstResource 
Smtesting.TheSecondResource 

答えて

1

TestUse_Failsは、私には理にかなって>()基本的にデフォルトのインスタンスを指定していることその型のために(そしてそれを加えて)。最後に一般的に勝った - 私はこれについて明示的なドキュメントを見つけることができませんが、それはほとんどのコンテナが動作する方法です。 r1呼び出しはTheSecondResource(最後の呼び出しはデフォルトに設定されています)を取得し、r2呼び出しは名前付きリソースを取得します。

TestUseOrderChangedは、init/configの後のデフォルトがTheFirstResourceですが、TheSecondResourceがまだ名前付きコンテナに追加されているために機能します。だから、r1はTheFirstResourceを(それが最後にあったのでデフォルトで)取得し、r2はTheSecondResourceを名前付きインスタンスとして正しく取得します。

TestInitializeAndConfigure_Failsは奇数です。私が座っている場所から、デフォルトは上書きされていないので、r1はTheFirstResourceを取得する必要があります - Use <>()が再度呼び出されていません。 Initializeを呼び出した後にConfigureを呼び出すと、でなく、がドキュメントに従ってコンテナをリセットします。私はObjectFactory.WhatDoIHave()を呼び出すと、TheFirstResourceがInitialize()およびConfigure()呼び出しの後に登録されているかどうかを確認します。

私にとっては、これはバグのように見えますが、構造マップユーザーグループ(http://groups.google.com/group/structuremap-users)に送信することを検討します。

+1

http://groups.google.com/group/structuremap-users/browse_thread/thread/f567ae92b1b98eae?hl=en – Stig

2

これに遭遇する人々を助けるために、ここでは男のジェーミー自身からの答えがあります。彼は彼のブログの質問hereに答えました。


For()。Use()は破壊的です。 For():デフォルトを取得するには()を1回、For()を2回コールすると、2回目の登録を取得するためにAdd()が使用されます。これら2つのAPI呼び出しのXmlコメントを見てください。


+0

唯一の彼の元の質問の一部に答えること。私にとっては、実際の問題は、テストの初期化と失敗の設定(そしてどこに問題があるのか​​)です。私はそれがバグだと思う。 –

関連する問題