[英]F# type provider in DAL
我有2个项目的解决方案:
我将需要调用SQL Server存储过程,并正在使用FSharp.Data.TypeProviders来完成这项工作。
type dbSchema = SqlDataConnection< "...", StoredProcedures=true >
let getDbContext connString =
match connString with
| "" -> dbSchema.GetDataContext()
| _ -> dbSchema.GetDataContext(connString)
插入:
let insertItem dbContext item =
dbContext.CreateStoredProc(item.Stuff)
要么
let insertItem connString item =
use dbContext = getDbContext connString
dbContext.CreateStoredProc(item.Stuff)
dbContext
都不会重新创建dbContext
? 我不想通过F#DAL公开整个dbContext
,而只公开某些存储过程。
注意:我需要从web.config中传入连接字符串
这里的类似问题不能完全提供我的答案: 类中SQL的F#类型提供程序
getDbContext
设置为内部或私有,但不能将dbSchema
。 有什么办法不暴露它吗? 如果我没弄错的话,上下文是DataContext的实例,它不是线程安全的。 我所知的数据上下文基类都不是线程安全的,并且由于要在Web应用程序中使用它们,因此至少必须为每个HTTP请求创建一个实例。 否则,您的DAL行为将是有缺陷的。
另一方面, 在单个请求中,可能值得重用同一实例。 因此,我将进行以下功能设计:
let insertItem dbContext item =
dbContext.CreateStoredProc(item.Stuff)
因为这样可以使您创建与单个HTTP请求关联的单个dbContext
值,并将其重新用于多个数据库操作,因为您可以将同一dbContext
值传递给多个函数。
如果要使所有这些都可以从C#访问,那么如果将所有功能都包装在类中,则对C#客户端开发人员来说将是最简单的。 假设上面的insertItem
函数以及OP中的getDbContext
函数,您可以定义以下类:
type ContextShim internal(ctx) =
member x.InsertItem(item : Item) =
insertItem ctx item
type ContextFactory() =
member x.CreateContext connectionString =
let ctx = getDbContext connectionString
ContextShim ctx
这将使C#客户端能够使用ContextFactory
类的Singleton实例,并且对于每个HTTP请求,使用其CreateContext
方法创建ContextShim
类的实例,然后使用ContextShim
实例上的成员,例如InsertItem
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.