StructureMap singleton usage(一个实现两个接口的类)

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实例。 我怎样才能得到一个?

您可以使用Forward <,>()注册来告诉StructureMap使用不同types的分辨率来parsingtypes。 这应该做你所期望的:

 ObjectFactory.Initialize(x => { x.For<IInterface1>().Singleton().Use<MyClass>(); x.Forward<IInterface1, IInterface2>(); }); 

我将注册MyClass本身,然后将其从各个接口的Use语句的上下文中提取出来。

 ForSingletonOf<MyClass>().Use<MyClass>(); For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>()); For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>()); 

尝试看看使用不同的重载,特别是Func重载。 从那里你可以知道StructureMap应该如何创build你的实例,而另一个对象已经被注册了。

一个ObjectFactory 旨在创build多个实例。 如果你想要一个单例,写一个单例类(也许使用public IInterface1IInterface2属性作为访问器)。

看起来有些粗略logging,但是也许你可以使用Container来代替。