从与Microsoft的ServiceCollection的接口解析类?

时间:2018-08-16 18:24:36

标签: c#

我最近一直在使用Microsoft的ServiceCollection作为DI容器,但是我注意到它不支持解析。我已经检查了所有方法,但无处显示它支持解析。

我需要解析通过接口创建的单例,以在创建实例的范围之外的其他地方使用该实例。这是否有原因?这是我需要的属性注入。

2 个答案:

答案 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());
}