[c#] .NET Core에서 연결 문자열을 읽는 방법?

구성 파일에서 연결 문자열 만 읽고이를 위해 “appsettings.json”이라는 이름의 파일을 내 프로젝트에 추가하고이 내용을 추가합니다.

{
"ConnectionStrings": {
  "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-

 WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
    "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
   }
 }
}

ASP.NET에서 나는 이것을 사용했습니다.

 var temp=ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

이제 C #에서 “DefaultConnection”을 읽고 .NET Core의 문자열 변수에 저장하려면 어떻게해야합니까?



답변

GetConnectionString 확장 메서드를 사용하여이를 수행 할 수 있습니다.

string conString = Microsoft
   .Extensions
   .Configuration
   .ConfigurationExtensions
   .GetConnectionString(this.Configuration, "DefaultConnection");

System.Console.WriteLine(conString);

또는 DI에 대한 구조화 된 클래스를 사용하는 경우 :

public class SmtpConfig
{
    public string Server { get; set; }
    public string User { get; set; }
    public string Pass { get; set; }
    public int Port { get; set; }
}

시작 :

public IConfigurationRoot Configuration { get; }


// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // http://developer.telerik.com/featured/new-configuration-model-asp-net-core/
    // services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));
    Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<SmtpConfig>(services, Configuration.GetSection("Smtp"));

그런 다음 홈 컨트롤러에서 :

public class HomeController : Controller
{

    public SmtpConfig SmtpConfig { get; }
    public HomeController(Microsoft.Extensions.Options.IOptions<SmtpConfig> smtpConfig)
    {
        SmtpConfig = smtpConfig.Value;
    } //Action Controller


    public IActionResult Index()
    {
        System.Console.WriteLine(SmtpConfig);
        return View();
    }

appsettings.json에서 다음과 같이합니다.

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
},

"Smtp": {
    "Server": "0.0.0.1",
    "User": "user@company.com",
    "Pass": "123456789",
    "Port": "25"
  }


답변

게시 된 답변은 괜찮지 만 연결 문자열에서 읽는 것과 동일한 질문에 직접 답변하지 않았습니다. 많은 검색을 통해 약간 더 간단한 방법을 찾았습니다.

Startup.cs에서

public void ConfigureServices(IServiceCollection services)
{
    ...
    // Add the whole configuration object here.
    services.AddSingleton<IConfiguration>(Configuration);
}

컨트롤러에서 구성에 대한 필드와 생성자에 대한 매개 변수를 추가하십시오.

private readonly IConfiguration configuration;

public HomeController(IConfiguration config)
{
    configuration = config;
}

이제 나중에보기 코드에서 다음과 같이 액세스 할 수 있습니다.

connectionString = configuration.GetConnectionString("DefaultConnection");


답변

자세한 내용은 https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings 링크를 참조하십시오.

JSON

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

C # Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

편집 : aspnetcore, 3.1부터 :
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1


답변

이 문제를 해결하기 위해 찾은 방법은 Startup시 빌더에서 AddJsonFile을 사용한 다음 (appsettings.json 파일에 저장된 구성을 찾을 수 있음)이를 사용하여 개인 _config 변수를 설정하는 것입니다.

public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        _config = builder.Build();
    }

그런 다음 구성 문자열을 다음과 같이 설정할 수 있습니다.

var connectionString = _config.GetConnectionString("DbContextSettings:ConnectionString"); 

이것은 dotnet core 1.1에 있습니다.


답변

ASP.NET Core ( 내 경우 3.1 )는 Controllers에 생성자 주입을 제공 하므로 다음 생성자를 간단히 추가 할 수 있습니다.

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    private readonly IConfiguration m_config;

    public TestController(IConfiguration config)
    {
        m_config = config;
    }

    [HttpGet]
    public string Get()
    {
        //you can get connection string as follows
        string connectionString = m_config.GetConnectionString("Default")
    }
}

appsettings.json은 다음과 같습니다.

{
    "ConnectionStrings": {
        "Default": "YOUR_CONNECTION_STRING"
        }
}


답변

또 다른 접근 방식이 있습니다. 내 예제에서는 ASP .NET MVC Core 3.1에서 종속성 주입과 함께 사용하는 리포지토리 클래스의 일부 비즈니스 논리를 볼 수 있습니다.

그리고 여기서는 connectiongString다른 저장소가 다른 데이터베이스에 전혀 액세스 할 수 없기 때문에 해당 비즈니스 논리 를 얻고 싶습니다 .

이 패턴을 사용하면 동일한 비즈니스 로직 저장소에서 다른 데이터베이스에 액세스 할 수 있습니다.

씨#

public interface IStatsRepository
{
            IEnumerable<FederalDistrict> FederalDistricts();
}

class StatsRepository : IStatsRepository
{
   private readonly DbContextOptionsBuilder<EFCoreTestContext>
                optionsBuilder = new DbContextOptionsBuilder<EFCoreTestContext>();
   private readonly IConfigurationRoot configurationRoot;

   public StatsRepository()
   {
       IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
       configurationRoot = configurationBuilder.Build();
   }

   public IEnumerable<FederalDistrict> FederalDistricts()
   {
        var conn = configurationRoot.GetConnectionString("EFCoreTestContext");
        optionsBuilder.UseSqlServer(conn);

        using (var ctx = new EFCoreTestContext(optionsBuilder.Options))
        {
            return ctx.FederalDistricts.Include(x => x.FederalSubjects).ToList();
        }
    }
}

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "EFCoreTestContext": "Data Source=DESKTOP-GNJKL2V\\MSSQLSERVER2014;Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}


답변

.net 코어와 .net 프레임 워크 모두에서 작동하는 데이터 액세스 라이브러리가 있습니다.

트릭은 .net 핵심 프로젝트에서 “app.config”라는 이름의 xml 파일 (웹 프로젝트 용)에 연결 문자열을 유지하고 ‘출력 디렉터리에 복사’로 표시하는 것이 었습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="conn1" connectionString="...." providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

ConfigurationManager.ConnectionStrings-연결 문자열을 읽습니다.

    var conn1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;