【问题标题】:Cannot add appsettings.json inside WPF project .net core 3.0无法在 WPF 项目 .net core 3.0 中添加 appsettings.json
【发布时间】:2020-05-11 12:49:24
【问题描述】:

我正在使用 .net Core 3.00 创建一个 WPF 项目,我无法将项目 appsettings.json 文件添加到我的项目中,该项目将用于存储我的数据库连接字符串。

我通常会在 app.config 内完成,但现在已从 .net Core 中删除。

Everywhere 提到使用appsettings.json 作为替代,并且必须使用IConfiguration 的实例在OnStartUp() 函数中手动添加和初始化,然后使用依赖注入将配置类传递到项目。

但我的问题是只能在asp.net Core 项目上添加appsettings.json 项目??不是我的 WPF 解决方案。

如果我遗漏了一些非常明显的东西(我可能是这样),我会很高兴,但我似乎找不到任何解决方案。

在此先感谢

【问题讨论】:

    标签: c# .net wpf .net-core-3.0


    【解决方案1】:

    步骤:

    • 添加以下 nuget 包

        Microsoft.Extensions.Configuration
        Microsoft.Extensions.Configuration.FileExtensions
        Microsoft.Extensions.Configuration.Json
        Microsoft.Extensions.DependencyInjection
      
    • 您需要手动创建和添加 appsettings.json 并将 copy it to output directory 设置为 copy if newer


    AppSetting.json

       {
      "ConnectionStrings": {
        "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
      },
    }
    

    Program.cs(适用于 .NetCore 控制台应用)

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
    
        IConfigurationRoot configuration = builder.Build();
    
        Console.WriteLine(configuration.GetConnectionString("BloggingDatabase"));
    }
    

    App.xaml.cs(适用于 .NET CORE WPF)

    public partial class App : Application
    {
        public IServiceProvider ServiceProvider { get; private set; }
     
        public IConfiguration Configuration { get; private set; }
     
        protected override void OnStartup(StartupEventArgs e)
        {
            var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
     
            Configuration = builder.Build();
    
          Console.WriteLine(Configuration.GetConnectionString("BloggingDatabase"));    
    
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
     
            ServiceProvider = serviceCollection.BuildServiceProvider();
     
            var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
            mainWindow.Show();
        }
     
        private void ConfigureServices(IServiceCollection services)
        {
            // ...
     
            services.AddTransient(typeof(MainWindow));
        }
    }
    

    参考资料:

    【讨论】:

    • 感谢您的回答,但我的问题是关于 WPF 而不是 ASP.Net,除非我缺少某些东西。当我在我的 WPF 解决方案上单击添加时,我认为我可以添加文件 Appsettings.json?类似于添加新类库的方式。但是搜索时没有出现
    • 是的,但是您是否尝试过手动添加 json 文件并检查它?
    • 为 WPF 和 Console .Net Core 更新了答案以提高清晰度
    • Appologies,我以为我已将其标记为答案。我知道了。
    • 另外,请务必从 App.xaml 中删除 StartupUri,因为我们正在覆盖 mainWindow 并手动显示它。也为了避免应用程序运行两次,在 DI 配置的情况下会抛出错误。
    【解决方案2】:

    在 .NET Core 中无需切换到 appsettings.json 文件。如果您愿意,您仍然可以在面向 .NET Core 的 WPF 应用程序中使用相同的“旧”基于 XML 的 App.config 文件。

    只需将一个新的配置文件(Project->Add New Item->Application Configuration File)添加到您的项目中,并将其命名为“App.config”。如果你再添加以下内容:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
       <connectionStrings>
        <add name="connectionString" connectionString="..."/>
      </connectionStrings>
    </configuration>
    

    ...您应该能够在运行时使用ConfigurationManager API 获取连接字符串:

    ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
    

    默认 WPF 模板应默认包含 System.Configuration.ConfigurationManager 包。

    【讨论】:

    【解决方案3】:

    将 App.config 文件添加到项目的根目录并添加以下代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <connectionStrings>
        <add name="AppConnectionString" connectionString="YourCS"/>
      </connectionStrings>
    
      <appSettings>
        <add key="DefaultLanguage" value="1"/>
      </appSettings>
    
    </configuration>
    

    appSettings 与 S 不是 s

    现在您可以在 dotnet core wpf 应用的任何位置阅读这些内容:

    string DefaultLanguage = ConfigurationManager.AppSettings.Get("DefaultLanguage"); 
    string ConnectionString = ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
    

    【讨论】:

      【解决方案4】:

      我找到了一条捷径。

      1. 安装包 Microsoft.Extensions.Configuration.Json

      2. 在解决方案中创建 AppSetting.json

        {
            "ConnectionStrings": 
            {
                "MyDataBase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
            }
        }
        
      3. 创建方法GetConnectionString

        public string GetConnectionString(string connectionStringName)
        {
            var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                                .AddJsonFile("appsettings.json",
                                             optional: false,
                                             reloadOnChange: true);
        
            var configurationRoot = builder.Build();
        
            var connectionString = configurationRoot.GetConnectionString(connectionStringName);
            return connectionString;
        }
        
      4. 在 OnConfiguring 中调用 GetConnectionString 方法

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            var connectionString = GetConnectionString("MyDataBase");
            optionsBuilder.UseLazyLoadingProxies().UseSqlServer(connectionString);
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        相关资源
        最近更新 更多