public interface IInterface1
{
}
public interface IInterface2
{
}
public class MyClass : IInterface1, IInterface2
{
}
...
ObjectFactory.Initialize(x =>
{
x.For<IInterface1>().Singleton().Use<MyClass>();
x.For<IInterface2>().Singleton().Use<MyClass>();
});
var x = ObjectFactory.GetInstance<IInterface1>();
var y = ObjectFactory.GetInstance<IInterface2>();
我使用上面的代码获得了两个不同的MyClass实例。我怎么才能得到一个?
答案 0 :(得分:52)
您可以使用Forward&lt;,&gt;()注册告诉StructureMap使用其他类型的分辨率解析类型。这应该符合您的期望:
ObjectFactory.Initialize(x =>
{
x.For<IInterface1>().Singleton().Use<MyClass>();
x.Forward<IInterface1, IInterface2>();
});
答案 1 :(得分:13)
我会注册MyClass本身,然后将其从各个接口的Use语句的上下文中拉出来。
ForSingletonOf<MyClass>().Use<MyClass>();
For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());
答案 2 :(得分:1)
尝试查看使用的不同重载,尤其是Func重载。从那里,您可以了解StructureMap应如何使用已注册的另一个对象创建您的实例。
答案 3 :(得分:-4)
ObjectFactory
打算来创建多个实例。如果你想要一个单例,那就写一个单例类(可能有公共IInterface1
和IInterface2
属性作为访问者)。
似乎有粗略记录,但也许您可以使用Container代替。