0

我使用 AutoFac。我必须使用从另一个服务获得的显式实例来解析类型。

例如:我有一个类型的实例,Client它是从某个地方(而不是容器)获得的。

我想配置 Autofac 容器,以便始终在Client解析类型对象时,它应该返回我的实例。

问题是我当时没有这个实例,当我用Containerbuilder- 配置容器时,我不能使用例如LambdaRegistration.

是否有其他解决方案可以解决我的问题?

4

1 回答 1

0

您可以执行以下操作:

MyService service = null;

builder.Register(c => service).As<IMyService>();

// Later on
service = new MyService();

根据您的需要,这种方法可能有很多变体,例如:

  • 向一些初始化代码发送一个“setter”委托,该代码将在服务创建后调用委托,例如MyServiceInitializer.AfterInitialization(s => service = s);
  • service变量提升为类属性并将该新包装器提供给初始化
  • 隐藏对特定读写抽象背后的服务的访问,例如interface IMyServiceContext { IMyService Current { get; } }interface IMyServiceSetter { void SetCurrent(IMyService service); }.
  • 通过抛出异常而不是抛出 null 来防止 Autofac 在初始化之前意外解析服务,例如Register(c => service ?? throw new InvalidOperationException("..."))

然而,重要的是要注意,一般来说,组件的创建应该是快速且可靠的。您的组件在启动时不可用的事实可能是因为它需要 I/O 来设置。这种情况应该尽量避免,例如将其完全隐藏在抽象后面。这允许您实现一个允许延迟加载真实服务的代理。

希望这能给你一些关于如何解决这个问题的线索。

于 2020-12-31T13:36:49.680 回答