2012-04-18 22 views
0

私はインターフェイスとそのインターフェイスを実装するクラスを持っています。そのクラスはデフォルトの静的インスタンスを持ち、明示的に(引数を渡して)構築することもできます。StructureMap既定のインスタンスと追加の明示的な引数を持つ

デフォルトインスタンスが静的インスタンスになるようにStrucutreMapを設定するにはどうしたらいいですか?また、引数を指定してインスタンスをリクエストすると、新しいインスタンスが作成されますか?ここで

は、私はあなたが直面している問題は、同じインタフェースのための複数の実装を登録するときに、最後の1がでGetInstanceによって解決されようとしているものであることだと思い

[TestFixture] 
public class StructureMapTests 
{ 
    [Test] 
    public void Test_same_interface_default_implemenation_and_with_parameter() 
    { 
     IMyInterface defaultImp = new MyImpl(0); 

     ObjectFactory.Initialize(x => 
            { 
             x.For<IMyInterface>().Use(defaultImp); 
             x.For<IMyInterface>().Add<MyImpl>().Ctor<int>().IsTheDefault();            
            }); 

     Assert.AreEqual(defaultImp, ObjectFactory.GetInstance<IMyInterface>()); 

     var instance1 = ObjectFactory.With("value").EqualTo(1).GetInstance<IMyInterface>(); 
     Assert.AreEqual(true, instance1 != defaultImp); //<-- fails here 
     Assert.AreEqual(1, instance1.GetValue()); 

     var instance2 = ObjectFactory.With("value").EqualTo(2).GetInstance<IMyInterface>(); 
     Assert.AreEqual(true, instance1 != defaultImp); 
     Assert.AreEqual(2, instance2.GetValue()); 
    } 

    public interface IMyInterface 
    { 
     int GetValue(); 
    } 

    public class MyImpl : IMyInterface 
    { 
     private int _value; 

     public MyImpl(int value) 
     { 
      _value = value; 
     } 

     public int GetValue() 
     { 
      return _value; 
     } 
    } 
} 

答えて

0

を失敗したテストです。これを解決するには、設定に名前を付けることができます。

次のことを試してみてください。

[TestFixture] 
public class StructureMapTests 
{ 
    [Test] 
    public void Test_same_interface_default_implemenation_and_with_parameter() 
    { 
     IMyInterface defaultImp = new MyImpl(0); 

     ObjectFactory.Initialize(x => 
            { 
             x.For<IMyInterface>().Add<MyInterface>().Named("withArgument").Ctor<int>().IsTheDefault();           
             x.For<IMyInterface>().Use(defaultImp).Named("default"); 
            }); 

     Assert.AreEqual(defaultImp, ObjectFactory.GetInstance<IMyInterface>()); 

     var instance1 = ObjectFactory.With("value").EqualTo(1).GetInstance<IMyInterface>("withArgument"); 
     Assert.AreEqual(true, instance1 is MyInterface); 
     Assert.AreEqual(1, instance1.GetValue()); 

     var instance2 = ObjectFactory.With("value").EqualTo(2).GetInstance<IMyInterface>("withArgument"); 
     Assert.AreEqual(true, instance2 is MyInterface); 
     Assert.AreEqual(2, instance2.GetValue()); 
    } 

    public interface IMyInterface 
    { 
     int GetValue(); 
    } 

    private class MyInterface : IMyInterface 
    { 
     private int _value; 

     public MyInterface(int value) 
     { 
      _value = value; 
     } 

     public int GetValue() 
     { 
      return _value; 
     } 
    } 
} 
関連する問題