0

インターフェイスと、そのインターフェイスを実装するクラスがあります。そのクラスにはデフォルトの静的インスタンスがあり、(引数を渡して) 明示的に構築することもできます。

デフォルトのインスタンスが静的インスタンスになるように 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;
        }
    }
}
4

1 に答える 1

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;
        }
    }
}
于 2012-04-18T07:12:06.600 に答える