gpt4 book ai didi

c# - 如何在主容器中注册类型,但在子容器中解析?

转载 作者:行者123 更新时间:2023-11-30 12:54:08 25 4
gpt4 key购买 nike

我有一个统一容器并使用 RegisterType 使用 ContainerControlledLifetimeManager 注册以下存储库和实现者。

public interface IPersonRepository
{
Person GetByID(ObjectSpace objectSpace, int id);
}

使用这种模式,我可以让多个线程(它是一个网络应用程序)同时使用同一个存储库实例,尽管每个线程都使用不同的 ObjectSpace(这是一个本地缓存+从数据库中获取对象的机制+工作单元等)。但这让我觉得“肮脏”,而不是好的:-)

我真正想要的是:

public interface IPersonRepository
{
Person GetByID(int id);
}

为此,我必须创建一个子容器并使用 RegisterInstance 来注册我的 ObjectSpace。只要我这样做就可以正常工作:

  1. 改为在子容器中注册 IPersonRepository
  2. 将生命周期管理器更改为 TransientLifetimeManager

我也不想做。 (1) 工作量太大,我想在父容器中注册一次,然后不再注册。 (2) 会工作,但如果有很多依赖关系,那么所有这些都必须是暂时的,这将导致每次我需要个人存储库时都会创建很多实例。

所以我的问题是:有没有办法在父容器中注册类型,但要解析容器生命周期实例并将其存储在子容器而不是父容器中?也许有一种使用自定义生命周期管理器之类的方法?

我想实现的是:

UnityContainer unityContainer = new UnityContainer();
//Might be a custom manager or something
unityContainer.RegisterType<IPersonRepository, PersonRepository>
(new ContainerControlledLifetimeManager());
using (var childContainer = unityContainer.CreateChildContainer())
{
childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace());
//01 Resolves a new instance inside the child container
var repository = childContainer.Resolve<IPersonRepository>();
//02 resolves same instance as 01
repository = childContainer.Resolve<IPersonRepository>();
}

using (var childContainer = unityContainer.CreateChildContainer())
{
childContainer.RegisterInstance<ObjectSpace>(new MyObjectSpace());
//03 Resolves a new instance inside the child container
var repository = childContainer.Resolve<IPersonRepository>();
//04 resolves same instance as 03
repository = childContainer.Resolve<IPersonRepository>(); //Resolves the same instance
}

最佳答案

由于问了一个新的 HierarchicalLifetimeManager 问题已经添加到 Unity,所以在注册类型时应该使用它。

关于c# - 如何在主容器中注册类型,但在子容器中解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/530405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com