我在分层环境中有一个winforms项目。有一个服务层,一个处理器层,最后一个数据访问层。实际上,客户并不重要 - 它可能是winforms,web等。数据访问层正在使用EF。客户端应用程序允许用户在登录屏幕期间选择数据库,因此我的DBContext不能硬编码到一个数据库。使DBContext使用客户端选择的连接的最佳方法是什么,而不必在每次调用服务层时传递连接字符串(传递给DAL)?
感谢任何建议,谢谢!
答案 0 :(得分:0)
您可以将连接字符串存储在connectionStrings部分的app.config或web.config文件中。然后将连接字符串的名称传递给您DbContext's constructor中的基本DbContext。
<connectionStrings>
<add name="DefaultConnection[" connectionString="Data Source=localhost;Initial Catalog=YourDataBaseName;Integrated Security=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
public MyContext : DbContext
{
public MyContext() : base("DefaultConnection")
}
答案 1 :(得分:0)
这是我想出的。 Jake的解决方案要求我拥有web.config文件中的所有连接字符串(不是选项),并且我在每个层中传递通过每个方法调用使用的连接字符串的名称。或者,有一个我刚刚在运行时更新的连接字符串(这不起作用)。所以,这就是我想出来的,并且不需要我通过每一层的每次调用传递连接字符串名称或实际连接字符串。
1)为每个dal类添加了一个连接字符串变量:
Private ReadOnly _connectionString As String
2)为每个DAL类添加了2个构造函数
Public Sub New()
_connectionString = My.Settings.PrimaryConnectionString
End Sub
Public Sub New(ByVal connectionString As String)
_connectionString = connectionString
End Sub
这允许我默认使用DAL设置中指定的数据库,并允许我在整个应用程序中以统一的方式访问我的DBContext。
然后,我通过处理器和服务层遵循相同的模式。我声明了一个连接字符串变量和两个构造函数,一个带有connectionString参数,另一个没有。
服务领域:
Private ReadOnly _documentProcessor As DocumentProcessor
服务构造商:
Public Sub New()
_documentProcessor = New DocumentProcessor()
End Sub
Public Sub New(ByVal connectionString As String)
_documentProcessor = New DocumentProcessor(connectionString)
End Sub
这样,当我实例化我的服务时,我只传递一次连接字符串,只要我想使用该服务的特定实例。处理器和dal句柄中的构造函数在那里设置连接字符串,所以我只需要为每个服务的每个实例传入一次。我可以忍受。