Внедрение зависимостей работает в API, но не работает в консольном приложении .NET 8.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Внедрение зависимостей работает в API, но не работает в консольном приложении .NET 8.

Сообщение Anonymous »

Я пытаюсь использовать библиотеку, написанную для добавления функциональности Sharepoint. Вот как в библиотеке создается класс SharepointClient.

Код: Выделить всё

public class SharePointClient : ISharePointClient
{
private readonly SafeILogger _logger;
private readonly SharePointClientConfig _clientConfig;
private readonly GraphServiceClient _graphClient;

public SharePointClient(SafeILogger logger,
IOptions clientConfig)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_clientConfig = clientConfig.Value ?? throw new
ArgumentNullException(nameof(clientConfig));

_graphClient = GetAuthenticatedGraphClient();
}
}
Метод добавления библиотеки утилит выглядит следующим образом

Код: Выделить всё

public static class ServiceCollectionExtensions
{
public static IServiceCollection AddSharePointUtils(this IServiceCollection services)
{
services.AddOptions()
.BindConfiguration("SharePointClientConfig")
.ValidateDataAnnotations()
.ValidateOnStart();

services.AddScoped();

return services;
}
}
У меня есть класс FileUploader, который принимает класс SharepointClient в конструкторе, экземпляр которого мне нужно создать посредством внедрения зависимостей.

Код: Выделить всё

public class FileUploader : IFileUploader
{
private readonly ISharePointClient _sharePointClient;

public FileUploader(ISharePointClient sharePointClient)
{
_sharePointClient = sharePointClient ?? throw new ArgumentNullException(nameof(sharePointClient));
}

public async Task UploadFile(string fileSourceFilePath, string fileName)
{
await _sharePointClient.UploadFileToDrive("TestPath", "Test",
fileSourceFilePath, fileName);
}
}
Теперь я использовал эту утилиту в проекте API .NET 8, и DI работает отлично.

Код: Выделить всё

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddSafeILogger();
builder.Services.AddSharePointUtils();
builder.Services.AddScoped();
Но когда я пытаюсь реализовать это в консольном приложении .NET 8, я получаю следующую ошибку:

Код: Выделить всё

var services = new ServiceCollection();
services.AddSafeILogger();
services.AddScoped();
services.AddSharePointUtils();
var serviceProvider = services.BuildServiceProvider();
var fileUploader = serviceProvider.GetRequiredService();
'Невозможно разрешить службу для типа 'Microsoft.Extensions.Logging.ILogger'1[Common.SharePoint.Utils.SharePointClient]' при попытке активации ' Common.Api.Logging.SafeILogger'1[Common.SharePoint.Utils.SharePointClient]'.'

Метод AddSafeILogger() разрешает эту зависимость в проекте API, но не может разрешить зависимость в консольном приложении.
Вот AddSafeILogger:

Код: Выделить всё

namespace Common.Api.Logging;

public static class IServiceCollectionExtensions
{
public static IServiceCollection AddSafeILogger(this IServiceCollection services)
{
services.TryAddSingleton(typeof(SafeILogger));
return services;
}
}

Код: Выделить всё

SafeILogger
 — это класс, унаследованный от Microsoft.Extensions.Logging.Ilogger.
Я не уверен, почему реализация DI работает для приложения API, но в консольном приложении. когда я пытаюсь создать экземпляр FileUploader, вызвав метод GetRequiredService, я получаю упомянутую ошибку зависимости. DI для других пользовательских классов отлично работает в консольном приложении.

Подробнее здесь: https://stackoverflow.com/questions/791 ... pplication
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»