Внедрение зависимостей работает в 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]' while attempting to activate '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 — это класс, унаследованный от Microsfot.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#»