2010-09-20 75 views
1

如果我有以下内容并且我说ObjectFactory.GetInstance<Master>()是否可以告诉StructureMap将I_A实例设置为A_User与传递给Master的I_A相同的实例?StructureMap构造函数中参数的依赖关系

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 ___) { } 
} 

回答

1

更新: 作为@Joshua下面那根指出,这是默认的SM行为。以下单元测试表明。第一次测试使用默认行为。第二条显示,如果你想它,你将如何得到一个唯一的实例:StructureMap的

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); 
     } 

    } 
} 
+0

这对StructureMap应该是完全没有必要的。如果是,就有一个错误。 – 2010-09-20 18:48:52

+0

@Joshua Flanagan:很酷,我不知道。我写了一个单元测试来检查出来,并把它放在我的文章中。既然你是团队成员(并且给了我一个反对票),我不得不指出,如果文档不是基于不推荐的和详细的方法,这将更清楚:) – 2010-09-20 19:17:27

+0

我同意,并指出它是开源的,我们会贡献! – 2010-09-20 20:04:46

2

默认的行为都会给你一个“建立会话”(实际上,一个调用的GetInstance)中相同的实例。你不应该配置任何额外的东西来获得你想要的行为。

如果它没有按照您的预期工作,请发布更多详细信息,或在StructureMap mailing list上提及。

相关问题