2010-09-20 71 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上提及。

相關問題