Как сделать строку подключения доступной в N-Tier ASP.NET MVC Core 1.0 App с Autofac

Я связал слой вместе с помощью модулей автозапуска. Большое спасибо за endeffects. Вот как это сделать. Теперь я пытаюсь сделать строку подключения доступной в слое DAL. Я пытался зарегистрировать:

Configuration (Microsoft.Extensions.Configuration)

Из класса Startup, но безуспешно.

Наша помощь будет принята с благодарностью, спасибо Стефан

2 ответа

Решение

У меня есть следующая строка в моем методе ConfigureServices в startup.cs:

services.AddSingleton(serviceType => Configuration);
services.AddInstance<Microsoft.Extensions.Configuration.IConfiguration>(Configuration);

builder.Populate(services);
var container = builder.Build();
var serviceProvider = container.Resolve<IServiceProvider>();
return serviceProvider;

Затем в моем DAL я получаю доступ к нему через инъекции конструктора, такие как:

public MyDataContext(IConfiguration configurations)

Затем я могу получить доступ к этому элементу и получить информацию о своем подключении, например

configurations["Data:MyConnection:ConnectionString"]

Я не фанат моего DAL, которому нужно знать что-либо об имени строки подключения, я не думаю, что это является частью его ответственности. Я предпочитаю создавать свой собственный интерфейс:

Так, например, я бы создал что-то вроде:

public interface IConnectionSettings
{
  public ConnectionStringSettings DataWarehouse { get; }
  public ConnectionStringSettings Audit { get; }
  public ConnectionStringSettings Logging { get; }
  public ConnectionStringSettings Security { get; }
}

Затем, когда я использую Entity Framework с DI

public class SecurityContext : DbContext
{
  public SecurityContext(IConnectionSettings settings)
    : base (settings.Name)
  {
  }
}

Или ADO.Net по какой-то странной причине:

public class LoggingDataAccess
{
  private readonly string _connectionString;

  public LoggingDataAccess(IConnectionSettings settings)
  {
    _connectionString = settings.Logging.ConnectionString;
  }

  public void SomeRawAdo()
  {
    using (var con = new Connection(_connnectionstring))
    {
    }
  }
}

В моем DI:

public static class IocCOnfig
{
  public static void Start()
  {
    var builder = new ContainerBuilder();

    builder.Register(r => new ConnectionSettings
    {
      DataWarehouse = ConfigurationManager.ConnectionStrings["DataWarehouse"],
      // etc
    });
  }

  private class ConnectionSettings : IConnectionSettings
  {
    // implement interface...
  }
}
Другие вопросы по тегам