依赖注入网络核心控制台应用程序设置

时间:2019-10-29 12:12:00

标签: c# dependency-injection .net-core console-application

我正在尝试使用内置的DI对.Net Core Console应用程序使用依赖项注入。

我有2种以下方法:

    private static void RegisterServices()
    {
        var collection = new ServiceCollection();

        //repositories
        collection.AddScoped<IAccountDataRepository, AccountDataRepository>();
        collection.AddScoped<IClientDataRepository, ClientDataRepository>();
        collection.AddScoped<IAddressDataRepository, AddressDataRepository>();
        collection.AddScoped<IClientAccountDataRepository, ClientAccountDataRepository>();
        //services
        collection.AddScoped<IAccountDataService, AccountDataService>();
        collection.AddScoped<IClientDataService, ClientDataService>();
        collection.AddScoped<IAddressDataService, AddressDataService>();
        collection.AddScoped<IClientAccountDataService, ClientAccountDataService>();

        _serviceProvider = collection.BuildServiceProvider();

    }

    private static void DisposeServices()
    {
        if (_serviceProvider == null)
        {
            return;
        }
        if (_serviceProvider is IDisposable)
        {
            ((IDisposable)_serviceProvider).Dispose();
        }
    }

我可以使用以下方法使它在main方法中起作用:

private static IServiceProvider _serviceProvider;
private static IClientDataRepository _clientDataRepository;



static void Main(string[] args)
{

    RegisterServices();

    _clientDataRepository = _serviceProvider.GetService<IClientDataRepository>();

但是我需要将存储库注入服务,并将服务注入main,但是我不能在服务类中使用以下内容:

_clientDataRepository = _serviceProvider.GetService<IClientDataRepository>();

这是服务:

public class ClientDataService : IClientDataService
{
    private readonly ILogger _logger;
    private readonly IClientDataRepository _clientDataRepository;

    public ClientDataService(ILogger logger, IClientDataRepository clientDataRepository)
    {
        _logger = logger;
        _clientDataRepository = clientDataRepository;
    }

如果我使用

_clientDataRepository = _serviceProvider.GetService<IClientDataRepository>();

会给出错误

1 个答案:

答案 0 :(得分:1)

只需解决服务,服务提供商将在构建所请求对象的对象图时将存储库注入服务中

基于提供的ClientDataService,您还需要确保所有依赖项都已在服务集合中注册。

如当前所示,ClientDataService也依赖于ILogger,它似乎未在服务集合中注册。

services.AddLogging();

下面的示例使用原始提供的代码并使用依赖项注入重构以运行main。

public class Program
    private readoonly IClientDataService service;

    public Program(IClientDataService service) {
        this.service = service;
    }

    public void SomeMethod() {
        //...
    }

    //entry
    public static void Main(string[] args) {
        IServiceProvider serviceProvider = RegisterServices();

        Program program = serviceProvider.GetService<Program>();

        program.SomeMethod();

        DisposeServices(serviceProvider);
    }

    //Support
    private static IServiceProvider RegisterServices() {
        var services = new ServiceCollection();

        //repositories
        services.AddScoped<IAccountDataRepository, AccountDataRepository>();
        services.AddScoped<IClientDataRepository, ClientDataRepository>();
        services.AddScoped<IAddressDataRepository, AddressDataRepository>();
        services.AddScoped<IClientAccountDataRepository, ClientAccountDataRepository>();
        //services
        services.AddScoped<IAccountDataService, AccountDataService>();
        services.AddScoped<IClientDataService, ClientDataService>();
        services.AddScoped<IAddressDataService, AddressDataService>();
        services.AddScoped<IClientAccountDataService, ClientAccountDataService>();
        services.AddLogging(); //<-- LOGGING
        //main
        services.AddScoped<Program>(); //<-- NOTE THIS

        return services.BuildServiceProvider();
    }

    private static void DisposeServices(IServiceProvider serviceProvider) {
        if (serviceProvider == null) {
            return;
        }
        if (serviceProvider is IDisposable sp) {
            sp.Dispose();
        }
    }
}