C# 如何使连接字符串在带有Autofac的N层ASP.NET MVC Core 1.0应用程序中可用

C# 如何使连接字符串在带有Autofac的N层ASP.NET MVC Core 1.0应用程序中可用,c#,asp.net-mvc,autofac,n-tier-architecture,autofac-module,C#,Asp.net Mvc,Autofac,N Tier Architecture,Autofac Module,我通过autofac模块将该层连接在一起。非常感谢。现在,我试图使连接字符串在DAL层中可用。我试着注册: Configuration (Microsoft.Extensions.Configuration) 从Startup类,但没有任何成功。我在Startup.cs中的ConfigureServices方法中有以下行: services.AddSingleton(serviceType => Configuration); services.AddInstance<Micros

我通过autofac模块将该层连接在一起。非常感谢。现在,我试图使连接字符串在DAL层中可用。我试着注册:

Configuration (Microsoft.Extensions.Configuration)

从Startup类,但没有任何成功。

我在Startup.cs中的ConfigureServices方法中有以下行:

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;
然后,我可以访问该项目并提取我的连接信息,如:

configurations["Data:MyConnection:ConnectionString"]

我不是DAL的粉丝,我不需要知道连接字符串的名称,我不认为这是它的可修复性的一部分。我更喜欢创建自己的界面:

例如,我会创建如下内容:

public interface IConnectionSettings
{
  public ConnectionStringSettings DataWarehouse { get; }
  public ConnectionStringSettings Audit { get; }
  public ConnectionStringSettings Logging { get; }
  public ConnectionStringSettings Security { get; }
}
然后当我将实体框架与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...
  }
}

谢谢@Jeremy Armstrong,但我使用的是autofac,而不是ASP.NET Core中的DI。但我对autoface的尝试基本上是一样的…用剩下的代码编辑我的答案,将您的服务填充到autofac builder中,然后返回相应的服务提供商。
AddInstance
已重命名为
AddSingleton
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...
  }
}