EF Core в библиотеке классов и использование из проекта API - Как передать информацию о конфигурации в библиотеку классов? - PullRequest
0 голосов
/ 04 сентября 2018

Я настроил решение с помощью проекта библиотеки базовых классов .net и основного веб-API-интерфейса asp.net. Чтобы использовать мою библиотеку классов, я добавил интерфейс через ConfigureServices, где DataRepo - это класс в библиотеке классов.

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IDataRepo, DataRepo>();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Эта библиотека классов должна получить строку подключения для конкретной среды, которая будет в файле проекта API appsettings.json. Как я могу передать настройки конфигурации ему? Кроме того, я хочу добавить базовую модель данных EF в проект библиотеки, и я предпочел бы не регистрировать DbContext в проекте API, а вместо этого в конструкторе моей библиотеки использовать информацию о соединении для передачи вместе с конфигурацией в DbContext. Перво-наперво, как я могу получить параметры конфигурации из appsettings.json в мою библиотеку классов?

namespace DataLib
{
    public class DataRepo : IDataRepo
    {

        public DataRepo()
        {

        }

        public string GetHello()
        {
            return "hello from lib";
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Если вашему классу нужна строка подключения, просто передайте ей строку подключения. Вы можете использовать перегрузку для AddScoped, которая занимает Action<T>.

Сначала добавьте конструктор, который принимает строку подключения:

public class DataRepo : IDataRepo
{
    private readonly string _connectionString;

    public DataRepo(string connectionString)
    {
        _connectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
    }
}

Затем в Startup.cs:

services.AddScoped<IDataRepo>(p => new DataRepo(Configuration.GetConnectionString("Foo")));

Ваш класс не должен знать или не заботиться о том, откуда на самом деле берется строка соединения, поэтому другие подходы, такие как инъекция IConfiguration, здесь неверны.

0 голосов
/ 04 сентября 2018
  1. Если вы хотите разделить конфигурацию только между проектом lib и проектом веб-сайта, вам лучше использовать внедрение зависимостей для этого.

Проект lib не должен заботиться о расположении файла конфигурации. Каждый раз, когда нам нужна конфигурация в нашем проекте lib, скажем, ConnectionString, мы должны просто попросить ее.

Сначала нужно добавить ссылку на пакет в проект lib:

 <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />

А затем введите IConfiguration, когда нам это нужно. Например, у нас должен быть IConfiguration объект, внедренный в DataLib:

namespace DataLib
{
    public class DataLib: IDataRepo
    {
        private readonly IConfiguration _configuration ;
        public DataLib(IConfiguration config ){
            this._configuration=config;
        }

        public string ConnectionString{
            get{
                return _configuration.GetConnectionString("DefaultConnection");
            }
        }
    }
}

IConfiguration не имеет значения, где находится файл конфигурации или какие аргументы передаются командной строкой при запуске. На самом деле, это ни о чем не заботится. DataLib просто использует простое POCO.

Когда нам нужен класс lib в основном проекте, мы можем просто добавить службу в контейнер DI следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddScoped<DataLib.DataLib>(); // if you want to use DbContext , just use AddScoped<TService>()

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Это все, что нам нужно сделать. appsettings.json и другие конфигурации будут встроены в экземпляр IConfiguration, а затем автоматически добавлены в проект lib.

  1. Есть и другие решения, такие как использование связанных файлов и т. Д. Тем не менее, приведенный выше подход делает DataLib простым POCO. Это замечательно . Поскольку библиотека всегда используется главным проектом, нам не нужно заботиться о конфигурации или о том, как она создается. Основной проект позаботится об этом.
...