结构映射默认实例和带有显式参数的附加实例

本文关键字:实例 参数 映射 默认 结构 | 更新日期: 2023-09-27 18:31:24

我有一个接口和一个实现该接口的类。该类具有默认的静态实例,也可以显式构造(传递参数)。

如何配置 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;
        }
    }
}

结构映射默认实例和带有显式参数的附加实例

我认为

您面临的问题是,当为同一接口注册多个实现时,最后一个是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;
        }
    }
}