如何为所有DAL(数据访问层)建立通用的连接字符串

时间:2019-03-28 12:25:07

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

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

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

  
    
      

实际上我不想使用EF(实体框架)

    
  
 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
        }                 
    }

2 个答案:

答案 0 :(得分:2)

您基本上是在问如何使用外部配置而不实际对其进行外部化。如果该语句的逻辑(或缺乏逻辑)不明显,则您无法获得所需的信息。

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

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

但是,这就是所谓的“反模式”。换句话说,这是您不应该做的事情。特别是对于诸如连接字符串之类的东西,往往需要随环境而变化,而使用这样的静态类很难实现。您还存在保护此字符串的问题,因为您的应用程序可以很容易地反编译以显示它,以及用于访问数据库的用户名和密码。如果您在考虑SecureString,在这里将无法使用。即使尝试从中构造出SecureString,原始的字符串文字仍然容易受到攻击。

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

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

总之,将配置保留在所属位置:在应用程序级别并已外部化。

答案 1 :(得分:0)

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