我最近一直在使用Microsoft的ServiceCollection作为DI容器,但是我注意到它不支持解析。我已经检查了所有方法,但无处显示它支持解析。
我需要解析通过接口创建的单例,以在创建实例的范围之外的其他地方使用该实例。这是否有原因?这是我需要的属性注入。
答案 0 :(得分:1)
服务集合用于收集和注册所有服务。在这里,您可以从集合中构建服务提供商,以解决所需的服务。
var services = new ServiceCollection();
services.AddSingleton<IService, Service>();
//...add other services
IServiceProvider serviceProvider = services.BuildServiceProvider();
IService service = serviceProvider.GetService<IService>();
如果您希望能够通过属性注入将一项服务分配给另一项服务,请利用工厂委托作为参数来访问提供者。
例如
services.AddTransient<IProvider>(sp => new Provider() {
ServiceProperty = sp.GetService<IService>()
});
在解决IProvider
时,将调用延迟的工厂委托,并根据需要使用提供程序来注入依赖项。
答案 1 :(得分:0)
您可以尝试使用下面的服务集合扩展,并且可以在Microsoft docs
中找到// Services that implement IDisposable:
public class Service1 : IDisposable {}
public class Service2 : IDisposable {}
public class Service3 : IDisposable {}
public class SomeServiceImplementation : ISomeService, IDisposable {}
public void ConfigureServices(IServiceCollection services)
{
// The container creates the following instances and disposes them automatically:
services.AddScoped<Service1>();
services.AddSingleton<Service2>();
services.AddSingleton<ISomeService>(sp => new SomeServiceImplementation());
// The container doesn't create the following instances, so it doesn't dispose of
// the instances automatically:
services.AddSingleton<Service3>(new Service3());
services.AddSingleton(new Service3());
}