【问题标题】:How to make the connection string available in a N-Tier ASP.NET MVC Core 1.0 App with Autofac如何使用 Autofac 使连接字符串在 N 层 ASP.NET MVC Core 1.0 应用程序中可用
【发布时间】:2023-03-27 00:22:01
【问题描述】:

我通过 autofac modules 将层连接在一起。非常感谢endeffectsHere is the HowTo。现在我正在尝试使连接字符串在 DAL 层中可用。我尝试注册:

Configuration (Microsoft.Extensions.Configuration)

来自 Startup 类,但没有任何成功。

【问题讨论】:

    标签: c# asp.net-mvc autofac n-tier-architecture autofac-module


    【解决方案1】:

    我在 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;
    

    然后在我的 DAL 中,我通过构造函数注入访问它,例如:

    public MyDataContext(IConfiguration configurations)
    

    然后我可以访问该项目并提取我的连接信息,例如:

    configurations["Data:MyConnection:ConnectionString"]
    

    【讨论】:

    • 感谢@Jeremy Armstrong,但我使用的是 autofac 而不是 ASP.NET Core 的 DI。但我正在尝试与 autoface 基本相同...
    • 用剩余的代码编辑了我的答案,将您的服务填充到您的 autofac 构建器中,然后返回适当的服务提供商。
    • AddInstance 已重命名为 AddSingleton github.com/aspnet/Announcements/issues/119
    【解决方案2】:

    我不喜欢我的 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...
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2020-07-06
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多