2012-04-18 3 views
0

У меня есть интерфейс и класс, который реализует этот интерфейс. Этот класс имеет статический экземпляр по умолчанию и может также быть сконструирован явно (передавая аргумент).StructureMap экземпляр по умолчанию и дополнительные с явными аргументами

Как настроить StrucutreMap так, чтобы экземпляр по умолчанию был статическим экземпляром, и если я запрашиваю экземпляр с аргументом, который будет создан новый?

Вот тест, который не может

[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

Я думаю, что проблема, с которой вы столкнулись в том, что при регистрации нескольких реализаций для того же интерфейса, последний из которых является тот, который будет решен 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>().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; 
     } 
    } 
} 
Смежные вопросы