gpt4 book ai didi

c# - IOC/Autofac 容器

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:31 24 4
gpt4 key购买 nike

我目前正在使用 Autofac,但也愿意接受有关其他 IOC 容器的评论。如果可能的话,我更喜欢使用 Autofac 的解决方案。我对 IOC 也有些陌生,所以我可能严重误解了我应该使用 IOC 容器做什么。

基本上情况是这样的:

我的应用有一个最顶层的 IOC 容器。我有一个子容器/范围树,我希望相同的“服务”(IWhatever)根据它在树中解析的级别进行不同的解析。此外,如果服务未在树中的某个级别注册,我希望树向上横向,直到找到合适的实现。

此外,在构造给定组件时,我很可能需要访问父容器/范围。在许多情况下,我正在注册的组件将依赖父范围内的相同或不同服务。

有什么方法可以用 Autofac 表达这种依赖性吗?像这样的东西:

builder.Register(c=>
{
var parentComponent = ?.Resolve<ISomeService>();
var childComponent = new ConcreteService(parentComponent, args...);
return childComponent;
}).As<ISomeService>();

由于以下几个原因,我无法使用与上述伪代码类似的任何东西:

A) 范围树中的所有级别似乎都共享一组通用的注册。我似乎无法找到一种方法来将给定的注册限制在某个“范围”内。

B) 我似乎无法找到一种方法来获取给定范围的父范围。我可以在容器中解析 ILifetimeScope,然后将其封装到提供其父范围的具体 LifetimeScope 实例,但我猜它可能是注意以这种方式使用的。这样安全吗?

C) 我不确定如何告诉 Autofac 哪个容器拥有已解析的对象。对于许多组件,我希望组件由构建它的范围“拥有”。标记的上下文可以帮助我吗?我是否必须用唯一标签标记树的每一层?这会很困难,因为树的深度是在运行时确定的。

很抱歉这个冗长的问题。总结:

1) 有什么方法可以用 Autofac 做我想做的事吗?

2)是否还有其他容器更适合这种依赖结构?

3) IOC 是完全错误的工具吗?

最佳答案

Autofac 1.4 很容易支持这一点,可能是目前最好的选择。您可以简单地在子容器中注册子容器组件。

尽管正在研究中,但您正在使用的 Autofac 2 还没有简单的等效项。

关于c# - IOC/Autofac 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028726/

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