我有一组遵循相同模式的许多数据库,并且我已经在应用程序的模型层中抽象出了相关的表。我使用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,但我还需要它有点动态(基于数据库标识符输入的明确输出)
这似乎是一个简单的问题,但我在一些专门的搜索之后找到的是关于如何使用实体框架或从模型等生成数据库的人的示例,而不是使用连接字符串。
请告知,并一如既往地感谢SO社区。 p>
答案 0 :(得分:3)
这是为了回答你更常见的问题"我的问题是标准结构应该采用这种方法的去处? "只是稍微扩展了一些建筑思想......
不确定您是否已经这样做了,尽管我会将您的数据库任务(如所有CRUD和连接内容)放入其自己的项目中 - 在这种情况下为数据访问层。将此项目与您的模型分开。 - 这种直接回答你最初的问题"它应该去哪里......"
然后,您可以添加对模型图层的引用。 (假设您自己拥有项目中的所有模型)
这使得这两个人分开。为什么?好吧,有一天你可能决定使用Entity Framework,或者其他一些与数据库通信的方法。如果是这种情况,那么您只需要更改数据访问层。而且你可以让你的模特看起来都闪闪发光,仍然是新的。
如果你想真正推出这条船,那么在你的网站和现在新的数据访问层之间创建另一个项目 - 称之为服务。这将是您的数据库和您的网站之间的中间人。
您可以从网站控制器中调用此中间人服务。然后中间人服务运行到数据访问层。该层进入数据库,获取数据,填充模型并将其返回给中间人。您的中间人现在应用与您的网站相关的任何业务逻辑,并将您的数据模型转换为视图模型(模型的瘦版本仅用于您正在显示的网站视图) - 这样做的好处是不会发送大型复杂信息对象到您的视图进行渲染。它还使您的数据访问和模型层保持业务逻辑(通常与调用中间人的项目直接相关)。
现在事情已经很好地解决了,你可以随着需求的变化而切换位和爆发。
所以,总的来说,工作流程将是这样的:
用户点击链接
网站控制器被点击以获取数据...
控制器向服务中间人询问数据,但是 控制器只需要一点点,所以要求一个小版本 (视图模型)
服务中间人说好了,给我一分钱......'
然后服务中间人跑到数据访问层并说 ' Gimme这个数据'并要求一个完整的模型(来自数据库的一行)
然后中间人从数据访问层取回并说出来 嗯......管制员说他不需要这些房产中的一半。' 所以中间人创建一个ViewModel的实例(你 定义,像模型一样)。
然后中间人用数据填充此实例,即视图模型 从数据访问层给出的模型。
中间人也可能做其他一些事情,商业逻辑......
然后他把它交还给控制器并说“你去了” govn'
然后控制器在其动作结果中返回它。
有一种有趣的方式来解释它:D
一点注意事项
您提到人们通常似乎是从模型创建数据库 - 这称为Code First。你也可以做数据库优先 - 完全听起来......
我会为此推荐Entity Framework Powertools。它有一个很棒的逆向工程工具,可以构建你的所有模型和工具。你的数据库的关系。太棒了!
答案 1 :(得分:2)
如果将连接字符串放在web.config中,则可以使用ConfigurationManager.ConnectionStrings:
var connectionString = ConfigurationManager
.ConnectionStrings["ConnectionName"].ConnectionString;
答案 2 :(得分:0)
我最终在WebApiConfig.cs文件中添加了一个公共静态方法。此方法接收标识符并吐出连接字符串。只需要一个,所以这没关系。我正在继续这样做,但如果有评论支持或反对这种方法,我很乐意听到它。我现在正在学习这些东西,而Web API与Web Forms相去甚远。感谢所有人的关注!
public static string getConnectionString()
{
return "the connection string";
}
编辑:在回顾其他答案中的评论之后,我还补充说我将在web.config中存储连接字符串的更好部分,并且仅使用getConnectionString()方法来提取来自ConfigurationManager并在初始目录上添加,这是连接字符串中唯一的变化部分。谢谢大家的关注。
@Darren:我也肯定会研究N-Tier架构,因为它看起来像是一种非常稳定的处理方式,尽管我认为它现在超出了我的意图范围。感谢所有各方提供的一些优秀信息。