Доступ к значениям appsettings.json в другом проекте в приложении WPF .NET Core - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в .NET core и в настоящее время играю с приложением WPF .NET Core. Я структурировал свое решение с помощью трех разных проектов: View, ViewModel и Model.

My Model содержит бизнес-логику, и в ней я получаю данные счета из разных источников. Теперь мне нужно исключить счета с определенными номерами счетов. Я решил определить эти числа в файле appsettings.json. После некоторых исследований я узнал, что должен инициализировать экземпляр IConfigurationBuilder внутри метода OnStartup() в файле App.xaml.cs в проекте View. Я прочитал классы конфигурации должны быть определены в целевом проекте (в моем случае Model проект) и использованы в методе OnStartup() проекта View, так что внедрение зависимости может бытьиспользуется для передачи класса config целевому проекту, как описано в по этой ссылке .

Однако, чтобы этот метод работал, я должен добавить зависимость к моему Model проекту в моемView проект, так что класс конфигурации можно получить там. Я считаю, что это нарушит схему MVVM - по крайней мере, как я понимаю.

Как бы вы решили эту проблему? Каковы лучшие практики здесь? Или я делаю вещи совершенно неправильно? Я также открыт для предложений использовать совершенно другой подход.

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вы должны добавить зависимость к проекту Model в проекте View, так как он также служит корнем композиции для проекта (содержит метод OnStartup()). Зависимость от Model оправдана.

Вы не разбиваете MVVM, если у вас нет кода в представлениях, который выполняет операции непосредственно с моделью, пропуская модели просмотра. Представления могут знать о Моделях (не наоборот), и это может быть полезно в некоторых ситуациях (например, ссылаться на некоторые enum из проекта Model в триггере в стиле xaml через {x:Static model:MyEnum.MyValue})

0 голосов
/ 11 октября 2019

Я решил просто передать экземпляр IConfiguration в проект Model и обработать его оттуда, чтобы код настройки конфигурации (например, configurationBuilder.Configure<MySettingsClas>()) был больше не в проекте View, а в проекте Model,Таким образом, мне не нужно добавлять зависимость от модели в представление.

Мой класс App теперь выглядит следующим образом:

public partial class App : Application
{
    public IConfiguration Configuration { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        IConfigurationBuilder builder = new ConfigurationBuilder()
                                        .SetBasePath(Directory.GetCurrentDirectory())
                                        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

        Configuration = builder.Build();

        ServiceCollection serviceCollection = new ServiceCollection();
        ConfigureServices(serviceCollection);

        IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();

        MainWindow mainWindow = new MainWindow(serviceProvider.GetRequiredService<IConfiguration>());
        mainWindow.Show();
    }

    private void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton(Configuration);
    }
}

Не уверен, что это правильноспособ сделать это, хотя.

...