Как сделать строку подключения доступной в 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...
}
}