3-уровневая архитектура .Net Core, передающая строку соединения с уровня представления на уровень данных - PullRequest
0 голосов
/ 02 октября 2018

У меня есть веб-API с 3-уровневой архитектурой, как показано ниже:

PresentationLayer (на уровне представления у меня есть appsetting.json, где находится строка подключения)

BusinessLayer (библиотека классов)

DataLayer (библиотека классов)

Когда я все еще использовал .Net Framework, я использовал в dataLayer этот код, показанный в ссылке ниже, чтобы получить строку подключения из web.config изуровень представления:

enter image description here

Сейчас я экспериментирую с .Net Core 2.1, и я создал один и тот же класс на уровне данных, но это не такза работой.Как я могу передать строку подключения от уровня представления к уровню данных наиболее эффективным способом.Есть ли аналогичный способ передачи строки подключения, когда я работал с .Net framework.

Не могли бы вы мне помочь, пожалуйста.

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Есть (мин) 3 варианта.Я думаю, что лучше всего использовать контейнер IoC.Может быть, вы предпочитаете добавить файл appconfig к слою БД и получить к нему доступ для настройки уровня слоя.Или вы можете использовать механизм внедрения по умолчанию, чтобы передать IConfiguration в Business Layer, а затем передать его в DataLayer через ctors.

Например,

/* ----- Startup.cs ----- */
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IxxxService, xxxBusinessService>();
}

/* ----- UI Layer ----- */
public xxxController(IxxxService xxxBusinessService)
{
   this.xxxBusinessService = xxxBusinessService;
}

/* ----- BUSINESS LAYER ----- */
/*
UI/controller knows Business service and IConfiguration objects, and default 
injector automatically creates/passes configuration object via ctor to Business layer.
*/
public xxxService(IConfiguration configuration)
{
    this.xxxRepository = new xxxRepository(configuration);
}

/* ----- DATA LAYER ----- */
public class xxxRepository: BaseRepository, IxxxRepository
{
    public xxxRepository(IConfiguration configuration)
        : base(configuration)
    {

    }
}       

public class BaseRepository{

    protected xxxDbContext context;

    public BaseRepository(IConfiguration configuration)
    {   
        var optionsBuilder = new DbContextOptionsBuilder<xxxDbContext>();

        optionsBuilder.UseSqlServer(configuration.GetSection("ConnectionString")["DefaultConnection"]);

        this.context = new xxxDbContext(optionsBuilder.Options);
    }
}
0 голосов
/ 03 октября 2018

Создание класса AppSettings

public static class AppSettings
{
    public static string ConnectionString { get; set; }
}

В файле Startup.cs

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

public IConfiguration Configuration { get; }

private void BuildAppSettingsProvider()
{
    AppSettings.ConnectionString = Configuration["ConnectionString"];
}

теперь вы можете получить доступ к AppSettings в своем уровне презентации.

100% работает.

0 голосов
/ 03 октября 2018

Если у вас несколько слоев, скорее всего, используется контейнер IOC.Создайте интерфейс в своем уровне данных и выполните реализацию на уровне представления, а затем зарегистрируйтесь и получите его с вашим контейнером IOC.Это самый чистый способ сделать это, если вы не можете передать его непосредственно в SqlConnection.

0 голосов
/ 03 октября 2018

как наиболее эффективно передать строку подключения от уровня представления к уровню данных.Есть ли аналогичный способ передачи строки подключения, когда я работал с .Net framework.

В Asp.Net Core гораздо проще передать соединение на DbConnection с зависимостьюИнъекции.

  • Изменить DbConnection для принятия connection string

    public class DbConnection
    {
    public DbConnection(string connectionString)
    {
        _sqlConnection = new SqlConnection(connectionString);
    }
    
  • Регистрация DbConnection в PresentationLayer

    services.AddTransient<DbConnection>(serviceProvider => new DbConnection(Configuration.GetConnectionString("DefaultConnection")));
    
...