Не удалось загрузить файл или сборку - PullRequest
2 голосов
/ 21 октября 2019

Я занимаюсь рефакторингом веб-приложения 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 с помощью внутреннего конструктора.

1 Ответ

2 голосов
/ 21 октября 2019

Вы не должны разрешать зависимости в вашей библиотеке классов. Композиция root может быть только в основном приложении. Корень композиции - это начальная и самая ранняя точка в жизненном цикле приложения, где можно настроить граф объектов.

Таким образом, Startup.cs - корень композиции в приложении ASP.NET Core.

services.AddScoped<IFileSystem, FileSystem>();

Библиотеки классов не имеют корня композиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...