Прочитать свойства компоновщика опций в методе расширения IServiceCollection - PullRequest
0 голосов
/ 03 октября 2018

У меня есть метод расширения на IServiceCollection, который выглядит следующим образом:

public static IServiceCollection AddMyProjData(this IServiceCollection services, Action<MyProjDataOptionsBuilder> optionsBuilder)
{
    services.Configure(optionsBuilder);

    services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
        .UseLazyLoadingProxies()
        .UseMySql("?????")
    );

    return services;
}

Класс MyProjOptionsBuilder выглядит следующим образом:

public class MyProjDataOptionsBuilder
{
    public string ConnectionString { get; set; }
}

Как добраться досвойство ConnectionString внутри моего метода расширения?

Я хочу сделать что-то вроде этого:

var connectionString = optionsBuilder().ConnectionString;

PS.

Я знаю, что могу напрямую передатьstring в качестве параметра вместо Action для метода расширения AddMyProjData.Но в моем реальном проекте мне нужно установить гораздо больше настроек, чем один ConnectionString.

Мне также нравится стиль использования Action для настройки сервиса.

1 Ответ

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

Я бы просто создал экземпляр MyProjDataOptionsBuilder внутри AddMyProjData, применил optionsBuilder к этому экземпляру, а затем использовал бы нужные мне свойства.Вот пример:

public static IServiceCollection AddMyProjData(
    this IServiceCollection services,
    Action<MyProjDataOptionsBuilder> optionsBuilder)
{
    var myProjDataOptionsBuilder = new MyProjDataOptionsBuilder();
    optionsBuilder(myProjDataOptionsBuilder);

    services.Configure(optionsBuilder);

    services.AddDbContext<MyProjDbContext>(contextOptions => contextOptions
        .UseLazyLoadingProxies()
        .UseMySql(myProjDataOptionsBuilder.ConnectionString)
    );

    return services;
}

Существует некоторое повторение с точки зрения того, что здесь происходит (вызывая optionsBuilder дважды два раза), но я не ожидаю, что это будет в целом дорогой ценой.

Альтернативой может быть разделение вашего времени конфигурации и параметров времени выполнения - я сомневаюсь, что вам понадобится сама строка подключения где-нибудь, кроме как внутри вашего метода расширения (я только догадываюсь здесь).


Из того, что вы показали в своем ОП, я не уверен, что MyProjDataOptionsBuilder - это отличное имя (я бы, наверное, просто использовал MyProjDataOptions), но это в основном здесь в стороне.

...