c# - 我可以让 StructureMap 管理具体类型的生命周期吗?

标签 c# inversion-of-control ioc-container structuremap

我有一个名为 TypeA 的类型。

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

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

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

最佳答案

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

关于c# - 我可以让 StructureMap 管理具体类型的生命周期吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240784/

相关文章:

c# - Service Fabric .Net 核心应用程序 - 不工作

c# - 如何在 WPF C# 中获取椭圆的位置?

spring - Spring Autowiring 有什么好处

asp.net-mvc - 无法在 SimpleInjectorInitializer 中检索用于验证的 Entity Framework 对象上下文

unit-testing - 如何使用命名组件对这个 IoC 注册进行单元测试? (Autofac)

c# - 为什么 Java 或 C# 中不允许多重继承?

c# - 从已包含表的 View 中的文件夹下载文件

c# - 使用 Unity 如何将命名依赖项注入(inject)构造函数?

dependency-injection - Autofac OwnedInstances 和 ASP.NET Web API 的 InstancePerApiRequest 支持

unit-testing - 单元测试 IoC 注册?