2013-03-06 73 views
4

我有一个称为TypeA的类型。我可以使StructureMap管理具体类型的生命周期吗?

类型A实现了2个接口:卓智和ITwo的

public class TypeA : IOne, ITwo 
{ 
    public TypeA(IThree ithree) 
    { 
     ... 
    } 
} 

我想配置StructureMap,这样只有一个过每个线程类型A的实例。我想任何IOne或ITwo的解决方案返回TypeA的相同实例(每个线程一个)。

我曾尝试以下配置:

ObjectFactory.Configure(x => 
{ 
    var thread = Lifecycles.GetLifecycle(InstanceScope.ThreadLocal); 
    x.For<TypeA>().LifecycleIs(thread).Use<TypeA>(); 
    x.For<IOne>().LifecycleIs(thread).Use<TypeA>(); 
    x.For<ITwo>().LifecycleIs(thread).Use<TypeA>(); 
    x.For<IThree>().LifecycleIs(thread).Use<TypeB>(); 
}); 

,然后解决这样

var test = ObjectFactory.GetInstance<IOne>(); 
var test2 = ObjectFactory.GetInstance<ITwo>(); 

但是这两个调用解析为不同的对象。

首先,我正在尝试使用StructureMap来实现吗? 如果是这样,那我该怎么做呢?

+1

我想你正在寻找'前进'命令。请参阅http://stackoverflow.com/questions/2363458/structuremap-singleton-usage-a-class-implementing-two-interface/2366838#2366838 – 2013-03-06 21:15:02

+0

谢谢,这是另一种选择 – nixon 2013-03-07 02:31:01

回答

1
For<IOne>().LifecycleIs(thread).Use<Impl>(); 
For<ITwo>().LifecycleIs(thread).Use(x => x.GetInstance<IOne>() as Impl); 

答评论:

For<Impl>().LifecycleIs(thread).Use<Impl>(); 
For<IOne>().LifecycleIs(thread).Use(x => x.GetInstance<Impl>()); 
For<ITwo>().LifecycleIs(thread).Use(x => x.GetInstance<Impl>()); 

这将做你想做的。我个人认为,因为你正在控制StructureMap的配置,所以你可以假设询问对象(ITwo)将返回一个非空值,第一个配置是好的。这是一个偏好问题。

+0

这就是我想要的,谢谢。我想知道是否有一种方法可以在没有'as'的情况下做到这一点?在解析类型之后不必检查空值会更好。 – nixon 2013-03-06 22:10:05

+0

已经更新的答案。 – 2013-03-07 01:15:55

+0

太棒了!谢谢克雷格 – nixon 2013-03-07 01:52:03

相关问题