我使用 AutoFac。我必须使用从另一个服务获得的显式实例来解析类型。
例如:我有一个类型的实例,Client
它是从某个地方(而不是容器)获得的。
我想配置 Autofac 容器,以便始终在Client
解析类型对象时,它应该返回我的实例。
问题是我当时没有这个实例,当我用Containerbuilder
- 配置容器时,我不能使用例如LambdaRegistration
.
是否有其他解决方案可以解决我的问题?
我使用 AutoFac。我必须使用从另一个服务获得的显式实例来解析类型。
例如:我有一个类型的实例,Client
它是从某个地方(而不是容器)获得的。
我想配置 Autofac 容器,以便始终在Client
解析类型对象时,它应该返回我的实例。
问题是我当时没有这个实例,当我用Containerbuilder
- 配置容器时,我不能使用例如LambdaRegistration
.
是否有其他解决方案可以解决我的问题?
您可以执行以下操作:
MyService service = null;
builder.Register(c => service).As<IMyService>();
// Later on
service = new MyService();
根据您的需要,这种方法可能有很多变体,例如:
MyServiceInitializer.AfterInitialization(s => service = s);
service
变量提升为类属性并将该新包装器提供给初始化interface IMyServiceContext { IMyService Current { get; } }
和interface IMyServiceSetter { void SetCurrent(IMyService service); }
.Register(c => service ?? throw new InvalidOperationException("..."))
然而,重要的是要注意,一般来说,组件的创建应该是快速且可靠的。您的组件在启动时不可用的事实可能是因为它需要 I/O 来设置。这种情况应该尽量避免,例如将其完全隐藏在抽象后面。这允许您实现一个允许延迟加载真实服务的代理。
希望这能给你一些关于如何解决这个问题的线索。