Обзор этого:
i. Убедитесь, что ваш DbRepository реализует интерфейс (IDbRepository, готово), так что он может быть вызван как служба и содержит конструктор, который используется для получения любых данных конфигурации
ii. Откройте appsettings.json из Startup.cs , чтобы получить данные конфигурации json
iii. Из Startup.cs создать DbRepository в качестве IDbRepository службы и передать строку подключения в качестве параметра
If DbRepository унаследованный от DbContext , вы можете добавить конструктор, подобный этому
public DbRepository(DbContextOptions<DbRepository> options) : base(options)
{
}
Альтернатива, вот как вы можете вручную создать конструктор, и для хорошей меры я имеюдобавлен метод тестирования GetConnectionString ()
public class DbRepository : IDbRepository
{
private string _connectionString;
public DbRepository(string connection)
{
_connectionString = connection;
}
public string GetConnectionString()
{
return _connectionString;
}
}
В Statup.cs посмотрите, как конструктор обращается к appsetting.json и сохраняет данныев поле Конфигурация
Посмотрите, как ConfigureServices вызывает службу IDbRepository и передает параметр
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using HospitalApp.Infrastructure;
namespace Test
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
string connectionString = Configuration["ConnectionString:connectionString"];
// this is how a class inheriting dbcontext can be called
// services.AddDbContext<DbRepository>(options => options.UseSqlServer(connectionString));
// or call IDbRepository as a custom service
services.AddScoped<IDbRepository>(repository => new DbRepository(connectionString));
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ... }
}
}
Представьте, что ваш HomeController выглядит примерно так, принимая экземпляр сервиса IDbRepository через его конструктор, чтобы он мог получить доступ к хранилищу и передать егострока подключения вк ViewBag
public class HomeController : Controller
{
private readonly IDbRepository _dbrepository;
public HomeController(IDbRepository dbrepository)
{
_dbrepository = dbrepository;
}
[HttpGet]
public ViewResult Home()
{
ViewBag.ConnectionString = _dbrepository.GetConnectionString();
return View("Home");
}
}
и Home.cshtml просто необходимо содержать следующее, чтобы продемонстрировать успех
<h1>ConnectionString</h1>
<b>@ViewBag.ConnectionString</b>
Подтверждено в тестовом проекте - впервые я создал сервис, который принимает параметр (ранее только что использовался dbcontext), так что было бы хорошо посмотреть на это - надеюсь, это поможет!
Вот мойappsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*",
"ConnectionString": {
"connectionString": "Server=W1571415\\MSSQLSERVER01;Database=***********;UserId=*********;Password=***********;"
},
"dependencies": {
"Microsoft.Extensions.Caching.Memory": "1.0.0",
"Microsoft.AspNetCore.Session": "1.0.0"
}
}