Я занимаюсь рефакторингом веб-приложения ASP.Net Core 2.2. Я решил перенести некоторые функции в отдельный проект библиотеки классов (.net core 2.2). Библиотека классов зависит от System.IO.Abstractions (поэтому она может быть проверена модулем). Упрощенная версия библиотеки классов выглядит следующим образом:
using System;
using System.IO.Abstractions;
namespace ClassLibrary1
{
public class TestService
{
private IFileSystem fileSystem;
internal TestService(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
public TestService() : this(new FileSystem()) {}
}
}
В проекте веб-приложения я добавил ссылку на библиотеку классов dll. В Startup.cs я добавил оператор using, а в ConfigureServices я регистрирую TestService (определенный в библиотеке классов) в контейнере DI:
...
using ClassLibrary1;
namespace WebApplication1
{
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<TestService>();
}
...
}
}
Я пытаюсь создать экземпляр службыв контроллере, например, так:
using ClassLibrary1;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
TestService service;
public HomeController(TestService service)
{
this.service = service;
}
...
}
}
Когда я запускаю этот проект, я получаю следующую ошибку:
FileNotFoundException: Не удалось загрузить файл или сборку 'System.IO.Abstractions, Версия = 7.0.0.0, Культура = нейтральная, PublicKeyToken = 96bf224d23c43e59 '. Системе не удается найти указанный файл.
Как решить эту проблему, не добавляя пакет System.IO.Abstractions в проект веб-приложения?
Насколько я понимаю, проблема возникает из-законструктор класса, который я пытаюсь разрешить с помощью DI, содержит тип IFileSystem, который является внешней зависимостью, поэтому веб-приложение не может разрешить его.
Одна вещь, которую я пытался сделать после поиска решенияК этой проблеме относится добавление метода расширения в библиотеку классов, который заботится о регистрации необходимых зависимостей:
using Microsoft.Extensions.DependencyInjection;
using System.IO.Abstractions;
namespace ClassLibrary1
{
public static class IServiceCollectionExtension
{
public static IServiceCollection AddTestService(this IServiceCollection services)
{
services.AddScoped<IFileSystem, FileSystem>();
services.AddScoped<TestService>();
return services;
}
}
}
Затем используйте этот метод расширения в ConfigureServices в веб-приложении следующим образом:
services.AddTestService();
Однако это приводит к тому же сообщению об ошибке.
РЕДАКТИРОВАТЬ:
Реальный вопрос, который у меня есть, как правильно создать библиотеку классов, чтобы она могла бытьиспользуется, не беспокоясь о зависимостях?
Таким образом, в веб-приложении должен быть создан экземпляр TestService с использованием открытогоКонструктор без параметров и внутри решения classlib в проекте xunit можно создать экземпляр TestService с помощью внутреннего конструктора.