Передача строки подключения приложения к библиотеке классов репозитория в ASP.NET 5 с помощью IConfigurationRoot
У меня есть веб-приложение ASP.NET 5 MVC и в Startup.cs Я вижу, что публичное свойство
IConfigurationRoot Configuration
устанавливается на
builder.Build();
На протяжении всего веб-приложения MVC я могу просто сделать
Startup.Configuration["Data:DefaultConnection:ConnectionString"]
чтобы получить строку conn из файла appsettings.json
.
Как я могу получить строку соединения, указанную в ASP.NET 5 MVC appsettings.json
, переданную в мою библиотеку классов репозитория с помощью вставки конструктора?
UPDATE:
Вот базовый репозиторий, на который наследуются все другие репозитории (так как вы можете видеть, что у меня сейчас есть строка жесткого кода):
public class BaseRepo
{
public static string ConnectionString = "Server=MYSERVER;Database=MYDATABASE;Trusted_Connection=True;";
public static SqlConnection GetOpenConnection()
{
var cs = ConnectionString;
var connection = new SqlConnection(cs);
connection.Open();
return connection;
}
}
В моем веб-приложении asp.net 5 в моем файле appsettings.json у меня есть следующее, что эквивалентно добавлению строки подключения к web.config в .net 4.5 webapp:
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=MYSERVER;Database=MYDATABASE;Trusted_Connection=True;"
}
}
Кроме того, в моем веб-приложении asp.net 5 у меня есть следующий код по умолчанию в моем Startup.cs, который загружает конфигурацию сайтов в общедоступное свойство типа IConfigurationRoot:
public IConfigurationRoot Configuration { get; set; }
// Class Constructor
public Startup(IHostingEnvironment env)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsDevelopment())
{
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
Теперь в моем веб-приложении asp.net, если я хочу получить доступ к любой из настроек приложения, я могу сделать следующее: Startup.Configuration["Data:DefaultConnection:ConnectionString"]
Но, к сожалению, я не могу сделать это из своей библиотеки классов.
Если кто-то хочет попытаться понять это, вот шаги для воспроизведения:
- Создайте новое веб-приложение ASP.NET 5 MVC.
- Добавить в проект еще один проект типа Class Library (Package).
- Выясните способ передачи appsettings из приложения ASP.NET 5 MVC в библиотеку классов.
После обновления я все еще не могу ее получить. Вот мой код:
public class BaseRepo
{
private readonly IConfigurationRoot config;
public BaseRepo(IConfigurationRoot config)
{
this.config = config;
}
}
Объявление этого класса не работает, поскольку BaseRepo теперь требует параметра конструктора.
public class CustomerRepo : BaseRepository, ICustomerRepo
{
public Customer Find(int id)
{
using (var connection = GetOpenConnection())
{
...
}
}
}
Ответы
Ответ 1
в файле Startup.cs добавьте следующий метод
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(_ => Configuration);
}
затем обновите свой класс BaseRepo следующим образом
public class BaseRepo {
private readonly IConfiguration config;
public BaseRepo(IConfiguration config) {
this.config = config;
}
public SqlConnection GetOpenConnection() {
string cs = config["Data:DefaultConnection:ConnectionString"];
SqlConnection connection = new SqlConnection(cs);
connection.Open();
return connection;
}
}
Ответ 2
ASP.NET предоставляет свой собственный способ передачи настроек конфигурации.
Предположим, что у вас есть это в вашем appSettings.json:
{
"Config": {
"Setting1": 1,
"Setting2": "SO"
}
}
Затем вам понадобится класс:
public class MyConfiguration
{
public int Setting1 { get; set; }
public string Setting2 { get; set; }
}
Это позволяет настроить службу с помощью этой конфигурации, добавив следующую строку
services.Configure<MyConfigurationDto>(Configuration.GetSection("Config"));
до ConfigureServices
.
Затем вы можете ввести конфигурацию в конструкторы, выполнив следующие действия:
public class SomeController : Controller
{
private readonly IOptions<MyConfiguration> config;
public ServiceLocatorController(IOptions<MyConfiguration> config)
{
this.config = config;
}
[HttpGet]
public IActionResult Get()
{
return new HttpOkObjectResult(config.Value);
}
}
Этот пример предназначен для контроллеров. Но вы можете сделать то же самое с другими слоями вашего приложения.
Ответ 3
Если ConfigureServices
в вашем проекте startUp.cs
содержит
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
и ваш файл cs вашего репозитория имеет конструктор инъекции, как показано ниже
public class MyRepo : IRepo
{
private readonly YourDbContext dbContext;
public MyRepo(YourDbContext ctx)
{
dbContext = ctx;
}
}
YourDbContext
будет автоматически разрешено.
Ответ 4
У меня есть конструктор в моем классе репозитория, который принимает строку подключения db в качестве параметра. Это работает для меня, когда я добавляю свой репозиторий для инъекций. В ConfigureServies() файла startup.cs добавьте это:
services.AddScoped<IRepos>(c => new Repos(Configuration["DbConnections:ConnStr1"]));
IRepos.cs
- это интерфейс, Repos.cs
- это класс, который его реализует. И, конечно, конфигурация - это просто ссылка на построенный объект IConfigurationRoot
.
Ответ 5
Существует уже метод расширения, который вы можете использовать для получения строк соединения из aspsettings.json.
-
Определите свои строки подключения в appsettings.json следующим образом:
{
"ConnectionStrings": {
"Local": "Data source=.\\SQLExpress;Initial Catalog=.......",
"Test:": "Data source=your-server;......"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
-
В вашем методе public void ConfigureServices(IServiceCollection services)
внутри вашего Startup.cs
вы можете получить строку соединения следующим образом:
var connectionString = this.Configuration.GetConnectionString("Local");
- Расширение
GetConnectionString
от Microsoft.Extensions.Configuration
.
- Наслаждайтесь:)
UPDATE
Сначала я не хотел вдаваться в подробности, потому что вопрос здесь уже был отмечен как ответ. Но я думаю, что могу показать свои 2 цента здесь.
Если вам нужен весь объект IConfigurationRoot
, введенный в контроллеры, @Chrono показал правильный путь.
Если вам не нужен весь объект, вы должны просто получить строку подключения, передать ее в DbContext внутри вызова ConfigureServices()
и ввести DbContext
в контроллеры. @Prashant Lakhlani показал это правильно.
Я просто говорю, что в сообщении @Prashant Lakhlani вы можете использовать расширение GetConnectionString
, чтобы немного очистить код.
Ответ 6
Вам нужно создать класс в проекте библиотеки классов, чтобы получить доступ к appsettings.json в проекте веб-сайта и вернуть строку соединения.
{
private static string _connectionString;
public static string GetConnectionString()
{
if (string.IsNullOrEmpty(_connectionString))
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
_connectionString = Configuration.Get<string>("Data:MyDb:ConnectionString");
}
return _connectionString;
}
public static IConfigurationRoot Configuration { get; set; }
}