2012-04-18 27 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; 
     } 
    } 
}