2017-11-28 13 views
1

C# 및 .NET Framework 4.7을 사용하여 ASP.NET Core 2.0.2 웹 API를 개발하고 있습니다.ASP.NET 코어 컨트롤러 내에서 액세스 문자열 연결

메서드의 컨트롤러에서 appsettings.json의 연결 문자열을 가져 오려고합니다.

나는 Startup.cs에 그것을했다 :

using Microsoft.Extensions.Configuration; 

public class Startup 
{ 
    public Startup(IConfiguration configuration) 
    { 
     Configuration = configuration; 
    } 

    public IConfiguration Configuration { get; } 

    // This method gets called by the runtime. Use this method to add services to the container. 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 
     services.AddDbContext<MyContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("MyContext"))); 

     [ ... ] 
} 

하지만 컨트롤러에서 작업을 수행하는 방법을 모르겠어요. 나는이 튜토리얼, Configure an ASP.NET Core App을 발견하지만, public class MyOptions

내가 Startup.cs, Configuration.GetConnectionString("MyContext")하지만 Configuration 클래스를 인식하지 못하는 경우에서처럼 그것을 위해 노력했다, 구성의 옵션에 액세스하기 위해 클래스를 사용합니다.

내 질문 : 컨트롤러에서 연결 문자열을 가져 오는 방법은 무엇입니까?

+1

확인 섹션 여기에 "사용 옵션 및 구성 개체"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration 사용 DI on IOptions Mate

+0

구성 [ "subsection : connStr"] – Mate

답변

4

: 좀 더 유연하게되므로

// using Microsoft.Extensions.Configuration; 

public class YourController : Controller 
{ 
     public YourController (IConfiguration configuration) 
     { 
      var connString = Configuration.GetConnectionString("MyContext"); 
     } 

} 

그러나 어쨌든 IOptions 패턴을 사용하는 것이 좋습니다.

public class MyOptions 
{ 
    public string ConnString { get; set; } 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    // Adds services required for using options. 
    services.AddOptions(); 

    services.Configure<MyOptions>(myOptions => 
    { 
     myOptions.ConnString = Configuration.GetConnectionString("MyContext"); 
    }); 

    ... 
} 

다음

public YourController ((IOptions<MyOptions> optionsAccessor) 
    { 
     var connString = optionsAccessor.Value.ConnString; 
    } 
-1
당신은 DbContextDatabase.GetDbConnection()를 ConnectionString이

public HomeController(DbContext context) 
    { 
     var connectionString = context.Database.GetDbConnection().ConnectionString; 
    } 

갱신과 같은 컨텍스트 연결 문자열 지정받을 수 있습니다

:. 또는 다음

public delegate string ConnectionStringExporter(); 

같은 대리자를 만들

로 등록 할 수 있습니다
services.AddSingleton<ConnectionStringExporter>(() => Configuration.GetConnectionString("Default")); 

N 다음 당신은 또한 지정된 연결 문자열 이름으로 위임 있었던 파라미터를 추가 할 수 있습니다 var connectionString = exporter();

와 ConnectionString을 얻을 수있는

public HomeController(ConnectionStringExporter exporter) 

로 주입. like public delegate string ConnectionStringExporter(string name);

+0

이 방법으로 연결 문자열을 받으면 데이터베이스 암호가 없습니다. – VansFannel

0

연결 문자열이 필요하지 않으면 이미 dbcontext를 삽입 할 준비가되었습니다. 따라서 기본적으로 dbcontext를 삽입 할 수 있습니다. (컨트롤러에서 이것을 수행하지 말고, 이것을 분리하고, 리파지토리 또는 무언가를 생성하고 이것을 주입하십시오.)

당신은 시동에 1 개 추가 주입을 추가해야합니다 : 당신이 상황과 같이 보일 것입니다

services.AddScoped<IDataContext, DataContext>(); 

:

public class DataContext : DbContext, IDataContext 
{ 
    public DbSet<User> Users { get; set; } 

    public DataContext(DbContextOptions options) : base(options) 
    { 
    } 
} 

그래서 당신은 어디서나 당신의 컨텍스트를 주입 할 수 있습니다.

아마 이것은 당신이 찾고있는 대답이 아닙니다. 이 경우, 당신은 모델을 추가 할 수 있으며 구성이 결합하고 모델처럼

뭔가 주입 :

services.Configure<AssetProviderServiceClientConfig>(
      Configuration.GetSection("AssetProviderServiceClient")); 

은 다음

private readonly SchedulerConfig _config; 

public YourController(IOptions<SchedulerConfig> config) 
{ 
    _config = config.Value; 
} 

환호와 같은 옵션을 삽입 할 수 있습니다!

편집 : 실행 SP; 당신의 상황이 당신이 뭔가 할 수있는 주입 경우

: 메모리 :) 중 ...

var command = databaseContext.database.GetDbConnection().CreateCommand(); 
cmd.CommandText = "your SP"; 
cmd.CommandType = CommandType.StoredProcedure; 
using (var reader = cmd.ExecuteReader()) 
{ 
    var entitites = reader.MapToList<Entity>(); 
} 

아마도 잘못된 몇 줄이 있습니다를

+0

저장 프로 시저를 실행하기 위해 ADO.NET에서 사용할 연결 문자열이 필요합니다. – VansFannel

3

당신은 당신의 컨트롤러에 IConfiguration 자체를 주입하고 얻을 수 있습니다 연결 문자열 :

직접 컨트롤러 (기본값 DI 컨테이너에 등록)에 IConfiguration configuration를 주입 할 수
public class HomeController : Controller { 
    private readonly string _connectionString; 
    public HomeController(IConfiguration config) { 
     _connectionString = config.GetConnectionString("MyContext"); 
    } 
}