【问题标题】:F# type provider in DALDAL 中的 F# 类型提供程序
【发布时间】:2015-01-04 03:56:59
【问题描述】:

我有 2 个项目的解决方案:

  1. F# 项目(用于数据访问 + 其他功能)
  2. C# Web 项目(将使用 F# 中的函数)

我需要调用 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)      
  1. 如何从 C# 中使用它,这样我就不会在每次插入时都重新创建 dbContext

我不想公开整个 dbContext,只是通过 F# DAL 公开某些存储过程。

注意:我需要从 web.config 传入连接字符串

此处的类似问题并未完全提供我的答案:F# Type Provider for SQL in a class

  1. 我可以将getDbContext 设置为内部或私有,但不能设置dbSchema。有什么办法不暴露?

【问题讨论】:

  • "这样我就不会每次都重新创建 dbContext" 你为什么不想这样做?
  • 如果我有它作为第一个插入,那么我可以创建一个 dbContext,并像这样传递它:[items] |> Seq.map (insertItem dbContext) 我不确定这是否是个好主意,但不要每次都重新创建上下文......
  • 另外,Tomas 在链接的答案中说“这会为每个工厂创建一个新的数据库实例”,这让我觉得这并不理想。

标签: c# sql-server f# type-providers


【解决方案1】:

如果我没记错的话,上下文是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

【讨论】:

  • 1.是的,当我尝试执行 [items] |> PSeq.map (insertItem dbContext) 时,我发现了非线程安全部分,但它失败了。 2.到底有没有隐藏SqlDataConnection提供者使用的dbSchema类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多