如果我有以下内容,并且我要说ObjectFactory.GetInstance<Master>()
是否有可能告诉StructureMap将I_A实例与A_User相同的实例与传递给Master的I_A相同?
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 ___) { }
}
答案 0 :(得分:2)
StructureMap的默认行为将始终在“构建会话”中为您提供相同的实例(实际上,只需调用一次GetInstance)。您不必为了获得所需的行为而配置额外的任何内容。
如果它无法正常工作,请发布更多详情,或在StructureMap mailing list上提及。
答案 1 :(得分:1)
<强>更新:强> 正如@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);
}
}
}