繁体   English   中英

在ASP.NET WebAPI中添加处理SQL连接字符串的方法的适当位置在哪里

[英]Where is the proper place to add a method to handle SQL Connection String in ASP.NET WebAPI

我拥有一组遵循相同架构的数据库,并且已经在应用程序的“模型”层中提取了相关的表。 我正在使用SQLConnections处理与数据库的连接,并使用数据适配器和数据表来存储信息,以及将信息移回并通过控制器等。下面的代码是我当前正在使用的代码,目前可以正常使用:

using (SqlConnection con =    
    new SqlConnection(
    "server=MyServersIp\\NameofInstance; " +
    "initial catalog=thisisvariable;" +
    "user id=username;" +
    "password=password123;")) { /* Stuff happening here */ }

我想在这里使用的是这样的东西:

using (SqlConnection con =    
    new SqlConnection(getConnectionString("databaseIdentifier")) 
    { 
        /* Stuff  still happening here */ 
    }

所以我正在寻找放置我的方法的正确位置:

public string getConnectionString(string databaseIdentifier)
{ 
    String theConnectionStringIneed = "appropriateConnectionString"
    return theConnectionStringIneed; 
}

在结构等方面,我对MVC和Web API还是很陌生,我想确保遵循最佳实践。

我的问题是这种方法在标准结构中应该去哪里? 我希望可以从任何地方访问它,以使整个连接字符串进程保持DRY,但是我还需要使其具有一定的动态性(基于数据库标识符输入的确定输出)

这似乎是一个简单的问题,但是经过一些专门的搜索后,我所能找到的只是关于如何使用实体框架或如何从模型等生成数据库的示例,而不是使用连接字符串。

请指教,并一如既往地感谢您。

这是为了回答您的更笼统的问题:“我的问题是这种方法应该在标准结构中放到哪里?”,并通过一些体系结构的思想对其进行了扩展。

不知道您是否已经这样做了,尽管在这种情况下,我会将您的数据库任务(如所有CRUD和连接内容一样)放入其自己的项目-数据访问层中。.将该项目与模型分开。 -这种直接回答您最初的问题“应该去哪里...”

然后,您可以向模型图层添加参考。 (假设您自己拥有所有模型的项目)

这将这两个保持分开。 为什么? 好吧,有一天您可能决定使用Entity Framework或其他与数据库通信的方法。 如果是这种情况,那么您只需要更改数据访问层即可。 而且,您可以使模型看起来仍然焕然一新。

如果您想真正解决问题,那么可以创建另一个项目,该项目位于您的网站和现在新的数据访问层之间-称为服务。 这将是您的数据库和网站之间的中间人。

您可以从网站控制器中调用此中间人服务。 然后,中间人服务运行到数据访问层。 该层进入数据库,获取数据,填充模型并将其返回给中间人。 您的中间人现在将应用与您的站点相关的任何业务逻辑,还将数据模型转换为视图模型(仅用于您要显示的网站视图的模型的瘦版本)之类的东西-这具有不向其中发送大型复杂对象的优势您的渲染视图。 它还将业务逻辑(通常与调用中间人的项目直接相关)与数据访问和模型层隔离。

现在事情已经很好地分解了,您可以随着需求的变化而切换。

因此,总的来说,这是一个外行术语。工作流程如下:

  • 用户点击链接

  • 网站控制器被击中以获取数据...

  • 控制器向服务中间人索要数据,但是控制器只需要一点数据,因此索要一个小版本(ViewModel)

  • 服务中间人说:“好的,给我一点时间。”

  • 然后,服务中间人运行到数据访问层,并说“给该数据给我”,并要求一个完整的模型(数据库中的一行)

  • 然后,中间人从数据访问层取回它,并说:“嗯。控制器说他不需要这些属性的一半。”因此,中间人创建了ViewModel的实例(您定义了一个模型) 。

  • 然后,中间人用数据访问层提供给它的模型中的数据填充该实例(视图模型)。

  • 中间人可能还会做一些其他的事情,例如业务逻辑的事情。

  • 然后,他将其交还给管制员,并说:“您去了”。

  • 然后,控制器将其返回到其动作结果中。

有一种有趣的小方法来解释它:D

一点注意事项

您提到过,人们通常似乎是根据模型创建数据库的-这称为“代码优先”。 您也可以执行数据库优先-听起来确实不错。

为此,我将推荐Entity Framework Powertools 它具有一个很棒的逆向工程工具,可以从数据库中构建所有模型和关系。 怪胎太棒了!

如果将连接字符串放在web.config中,则可以使用ConfigurationManager.ConnectionStrings:

var connectionString = ConfigurationManager
    .ConnectionStrings["ConnectionName"].ConnectionString;

MSDN

我最终在WebApiConfig.cs文件中添加了一个公共静态方法。 此方法接受一个标识符,然后返回连接字符串。 只需要一个,这样就可以了。 我正在继续前进,但是如果有人赞成或反对这种方法,我很乐意听到。 我现在正在学习这些内容,并且Web API与Web Forms相去甚远。 感谢大家的关注!

   public static string getConnectionString()
    {
        return "the connection string";
    }

编辑:在查看其他答案中的评论之后,我还添加了我将把连接字符串的更好部分存储在web.config中,并且仅使用getConnectionString()方法从ConfigurationManager中提取并添加到初始目录,连接字符串的唯一更改部分。 感谢大家的关注。

@Darren:我肯定也会研究N-Tier架构,因为它看起来是一种非常稳定的处理方式,尽管我认为目前为止这不在我的意图范围之内。 感谢所有方面的出色信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM