4

我有一种叫做 TypeA 的类型。

TypeA 实现了 2 个接口: IOne 和 ITwo

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

我想配置 StructureMap 以便每个线程只有一个 TypeA 实例。我希望 IITHER 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 实现的目标是什么?如果是这样,那我该怎么做?

4

1 回答 1

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)将返回一个非空值,并且第一个配置很好。这是一个偏好问题。

于 2013-03-06T18:38:14.287 回答