【问题标题】:How to make common connection string for all DAL(Data Access Layer)如何为所有 DAL(数据访问层)制作通用连接字符串
【发布时间】:2019-03-28 12:25:07
【问题描述】:

我必须在我的所有控制器中为 ConnectionString 使用“IConfiguration”。 而且我还必须在我的 DAL 中发送它。

我想做一个通用的DAL(数据访问层)并在其他DAL中继承。

其实我不想用EF(entity framework)

 public class UserController : Controller
    {
        public string ConnectionString { get; set; }

        private readonly IConfiguration configuration;

        public UserController(IConfiguration config)
        {
            this.configuration = config;
            ConnectionString = configuration.GetConnectionString("DefaultConnection");
        }

        public IActionResult ViewProfile()
        {
            UserControllerGateway userControllerGateway = new UserControllerGateway();

            UserProfileModel userProfile = new UserProfileModel();
            userProfile = userControllerGateway.ViewProfile(ConnectionString);//I have to send connectionString to my DAL

            return View(userProfile);
        }
///DAL
public class CommonGateway
    {
        public string ConnectionString { get; set; }
        public SqlConnection Connection { get; set; }
        public SqlCommand Command { get; set; }
        public string Query { get; set; }
        public SqlDataReader Reader { get; set; }

        public CommonGateway()
        {
            ConnectionString = " "; //What can I do here
        }                 
    }

【问题讨论】:

  • 为什么不直接在 DAL 或 DAL 的基类中使用和访问 IConfiguration 抽象?
  • 确实,配置功能已经在 .NET Core 中可用。无需添加另一个抽象。至于CommonGateway,它看起来像一个错误,它会使连接保持打开的时间比需要的时间长,从而损害性能并由于阻塞而增加延迟。数据访问服务类应该只在需要的地方创建连接并尽快关闭它们。连接的范围应该大于它们使用的方法
  • 应该在控制器中注入数据访问服务类,而不是连接字符串。数据类可能依赖于IConfiguration。另一种选择是在注册期间使用工厂方法读取连接字符串并将其作为参数传递给类的构造函数
  • @PanagiotisKanavos 看起来像是一个错字“连接应该的范围大于它们所使用的方法”

标签: c# asp.net-mvc model-view-controller asp.net-core-2.0 connection-string


【解决方案1】:

您基本上是在询问如何使用外部化配置而不实际外部化它。如果该语句的逻辑(或缺乏逻辑)不明显,那么您想要的就是不可能的。

在各种类和/或项目之间共享任何东西的方式是类,最有可能在类库中。如果您愿意,可以创建一个静态“常量”类来保存您的连接字符串:

public static class Constants
{
    public const string ConnectionString = "foo";
}

但是,这就是所谓的“反模式”。换句话说,这是你不应该做的事情。特别是像连接字符串这样的东西,往往需要因环境而异,这很难用像这样的静态类来实现。您还有保护这个字符串的问题,因为您的应用程序很容易被反编译以显示它,以及访问您的数据库的用户名和密码。如果你在想SecureString,那在这里行不通。原始字符串文字仍然很容易受到攻击,即使您尝试从中制作 SecureString

简而言之,外部化的配置被外部化是有原因的。它允许您为应用程序提供所需的信息,而无需将该信息紧密耦合到您的应用程序。您可以随意切换,重要的是使用安全存储机制来保护静态信息。

更重要的是,像 DAL 这样的东西应该是抽象的。即使您通常为特定应用程序创建它,它也应该具有一定程度的可重用性。如果您将连接字符串绑定到它,那么它就会与该特定域紧密耦合,这通常是一个糟糕的设计。

无论长短,将配置保留在它所属的位置:在应用程序级别并外部化。

【讨论】:

    【解决方案2】:

    您可以创建一个静态类并使用它在您需要的地方轻松访问您的 DAL 实现。

    【讨论】:

    • 这应该是一条评论。在任何情况下,通过使用依赖注入来修复都是一个坏主意。静态类使使用或测试服务更难
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多