【发布时间】:2019-12-12 21:38:29
【问题描述】:
我正在使用内置的 .Net Core IoC 容器来解决应用程序的依赖关系。我配置它的方式如下,使用 Scrutor 扫描我的程序集:
services.Scan(s => s
.FromAssembliesOf(currentAssemblyTypesList)
.AddClasses(false)
.UsingRegistrationStrategy(RegistrationStrategy.Append)
.AsImplementedInterfaces()
.WithTransientLifetime());
到目前为止,我遇到了一些简单的案例,其中每个接口都由一个依赖项实现,因此之前的配置完美地解决了整个依赖关系树。
现在考虑以下代码:
public interface IService {}
public class ServiceOne : IService
{
public ServiceOne(IDependency dependency) {}
}
public class ServiceTwo : IService
{
public ServiceTwo(IDependency dependency) {}
}
public class SomeClass
{
public SomeClass(IService service) {}
public void DoSomething()
{
this.service.SomeMethod();
}
}
在这种情况下,“SomeClass”位于依赖关系树的中间,并且我有两个实现相同接口的服务,而应该将哪个服务注入“SomeClass”直到运行时才知道。由于一些不重要的原因,我被要求为此使用 ActivatorUtilities 类。
我正在处理确定应该实例化哪个 IService 的两种方案:
- 在应用程序启动时,会设置一个标志,用于确定在注册之前要使用哪个服务(对于类似的设置,但不适用于相同的依赖关系树)。
- 在“DoSomething”方法的执行过程中,会决定应该使用两个服务中的哪一个,所以我猜应该注册某种工厂并将其注入“SomeClass”。
所以问题是我需要更改或添加到依赖项注册过程以及如何使用 ActivatorUtilities 类来实现这些目标?
谢谢。
【问题讨论】:
标签: c# .net-core ioc-container