Structuremap配置:一个对象,多个接口

Structuremap配置:一个对象,多个接口,structuremap,Structuremap,我有一个类型为“SessionObject”的对象“mySessionObject”。它实现了接口IMessageHandler和IMessageHandler。我应该只有其中一个对象,它应该贯穿整个HttpSession 如何在structuremap中注册它,以便在HttpSession生命周期中的任何时候都可以通过调用ObjectFactory.GetInstance(),或ObjectFactory.GetInstance(),来获取它 在您的常规StructureMap配置中,我将添加

我有一个类型为“SessionObject”的对象“mySessionObject”。它实现了接口
IMessageHandler
IMessageHandler
。我应该只有其中一个对象,它应该贯穿整个HttpSession


如何在structuremap中注册它,以便在HttpSession生命周期中的任何时候都可以通过调用
ObjectFactory.GetInstance()
,或
ObjectFactory.GetInstance()
,来获取它

在您的常规StructureMap配置中,我将添加以下代码:

ObjectFactory.Initialize(x =>
{
    x.ForRequestedType<IMessageHandler<MessageA>>().
        TheDefaultIsConcreteType<MyImplementingClass>().
        CacheBy(InstanceScope.HttpSession);

    x.ForRequestedType<IMessageHandler<MessageB>>().
        TheDefaultIsConcreteType<MyImplementingClass>>().
        CacheBy(InstanceScope.HttpSession);});
}
ObjectFactory.Initialize(x=>
{
x、 ForRequestedType()。
默认的混凝土类型()。
CacheBy(InstanceScope.HttpSession);
x、 ForRequestedType()。
默认混凝土类型>()。
CacheBy(InstanceScope.HttpSession);});
}
请注意,您将需要2.5.3 StructureMap版本,详见本SO线程:

我目前不使用编译器,但我相信CacheBy足够聪明,可以在实现类之间共享对象。如果没有,您可以用另一种方法构造MyImplementingClass,然后使用default()而不是defaultsConcreteType()