C# StructureMap默认实例和带有显式参数的附加实例
我有一个接口和一个实现该接口的类。该类有一个默认静态实例,也可以显式构造(传递参数) 如何配置StructReMap以使默认实例为静态实例,如果我请求一个带有参数的实例,则会构造一个新实例 这是失败的测试C# StructureMap默认实例和带有显式参数的附加实例,c#,dependency-injection,ioc-container,structuremap,C#,Dependency Injection,Ioc Container,Structuremap,我有一个接口和一个实现该接口的类。该类有一个默认静态实例,也可以显式构造(传递参数) 如何配置StructReMap以使默认实例为静态实例,如果我请求一个带有参数的实例,则会构造一个新实例 这是失败的测试 [TestFixture] public class StructureMapTests { [Test] public void Test_same_interface_default_implemenation_and_with_parameter() {
[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;
}
}
}
[TestFixture]
公共类StructureMapptests
{
[测试]
公共无效测试\u相同\u接口\u默认\u实现\u和带\u参数的\u()
{
IMyInterface defaultImp=新的MyImpl(0);
ObjectFactory.Initialize(x=>
{
x、 For().使用(defaultImp);
x、 For().Add().Ctor().IsTheDefault();
});
AreEqual(defaultImp,ObjectFactory.GetInstance());
var instance1=ObjectFactory.With(“value”).EqualTo(1.GetInstance();
Assert.AreEqual(true,instance1!=defaultImp);//我认为您面临的问题是,在为同一接口注册多个实现时,最后一个实现将由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;
}
}
}
[TestFixture]
公共类StructureMapptests
{
[测试]
公共无效测试\u相同\u接口\u默认\u实现\u和带\u参数的\u()
{
IMyInterface defaultImp=新的MyImpl(0);
ObjectFactory.Initialize(x=>
{
x、 For().Add().Named(“withArgument”).Ctor().IsTheDefault();
x、 For().Use(defaultImp).Named(“default”);
});
AreEqual(defaultImp,ObjectFactory.GetInstance());
var instance1=ObjectFactory.With(“value”).EqualTo(1).GetInstance(“With参数”);
AreEqual(true,instance1是MyInterface);
arenequal(1,instance1.GetValue());
var instance2=ObjectFactory.With(“value”).EqualTo(2).GetInstance(“With参数”);
AreEqual(true,instance2是MyInterface);
arenequal(2,instance2.GetValue());
}
公共接口IMyInterface
{
int GetValue();
}
私有类MyInterface:IMyInterface
{
私有整数值;
公共MyInterface(int值)
{
_价值=价值;
}
public int GetValue()
{
返回_值;
}
}
}