Зависимости StructureMap для аргументов в конструкторе - PullRequest
1 голос
/ 20 сентября 2010

Если у меня есть следующее, и я должен был сказать ObjectFactory.GetInstance<Master>(), можно ли сказать StructureMap сделать экземпляр I_A для A_User таким же, как I_A, переданный Master?

public interface I_A { }
public interface I_B { }

public class A_User {
    public A_User(I_A A) { }
}

public class Master {
    public Master(I_A _, I_B __, A_User ___) { }
}

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Поведение StructureMap по умолчанию всегда будет давать вам один и тот же экземпляр в «сеансе сборки» (фактически, один вызов GetInstance).Вам не нужно настраивать что-либо дополнительное, чтобы получить желаемое поведение.

Если оно не работает должным образом, пожалуйста, опубликуйте более подробную информацию или укажите это в списке рассылки StructureMap .

1 голос
/ 20 сентября 2010

ОБНОВЛЕНИЕ: Как отмечает @Joshua Flanagan ниже, это поведение SM по умолчанию. Следующие юнит-тесты показывают это. Первый тест использует поведение по умолчанию. Второй показывает, как вы получите уникальный экземпляр, если вы этого хотите:

using System;
using System.Collections.Generic;
using NUnit.Framework;
using StructureMap;
using StructureMap.Pipeline;

namespace SMTest
{
    [TestFixture]
    public class TestSOQuestion
    {

        class Foo : IFoo { }
        interface IFoo { }

        private interface IBar {
            IFoo Foo { get; set; }
        }
        class Bar : IBar
        {
            public IFoo Foo { get; set; }
            public Bar(IFoo foo)
            {
                Foo = foo;
            }
        }

        class UsesFooAndBar
        {
            public IBar Bar { get; set; }
            public IFoo Foo { get; set; }
            public UsesFooAndBar(IFoo foo, IBar bar)
            {
                Foo = foo;
                Bar = bar;
            }
        }

        [Test]
        public void TestOtherAnswer()
        {
            IContainer container = new Container(x =>
                                         {
                                             x.For<IFoo>().Use<Foo>();
                                             x.For<IBar>().Use<Bar>();
                                         });
            var usesFooAndBar = container.GetInstance<UsesFooAndBar>();
            Assert.AreSame(usesFooAndBar.Foo, usesFooAndBar.Bar.Foo);            
        }

        [Test]
        public void TestNonDefaultBehaviour()
        {
            IContainer container = new Container(x =>
                                         {
                                             x.For<IFoo>().AlwaysUnique().Use<Foo>();
                                             x.For<IBar>().Use<Bar>();
                                         });
            var usesFooAndBar = container.GetInstance<UsesFooAndBar>();
            Assert.AreNotSame(usesFooAndBar.Foo, usesFooAndBar.Bar.Foo); 
        }

    }
}
...