代码之家  ›  专栏  ›  技术社区  ›  Adam Rackis

构造函数中参数的StructureMap依赖项

  •  1
  • Adam Rackis  · 技术社区  · 14 年前

    如果我有以下的话,我会说 ObjectFactory.GetInstance<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 回复  |  直到 14 年前
        1
  •  1
  •   Joshua Flanagan    14 年前

    更新时间: 正如@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); 
            }
    
        }
    }
    
        2
  •  2
  •   Joshua Flanagan    14 年前

    如果它不是你所期望的工作,请张贴更多的细节,或在网站上提及 StructureMap mailing list .