基于 Daniel Mohl 及其书籍的优秀样例。
我有一个使用 F# 的 ASP.NET MVC 应用程序,采用在线模板。到目前为止,我的模型、实体、控制器、存储库、视图等都非常通用和可重复使用,并且查询功能很强大。但是我找不到一种方法来保持将数据保存到 DbContext 的部分同样具有可重用性。
对于查询部分,Repository.fs 的代码如下:
我有一个使用 F# 的 ASP.NET MVC 应用程序,采用在线模板。到目前为止,我的模型、实体、控制器、存储库、视图等都非常通用和可重复使用,并且查询功能很强大。但是我找不到一种方法来保持将数据保存到 DbContext 的部分同样具有可重用性。
对于查询部分,Repository.fs 的代码如下:
namespace Melopienso.Repositories
open System
open System.Linq
module Repository =
let get (source:IQueryable<_>) queryFn =
queryFn source |> Seq.toList
let getAll () =
fun s -> query { for x in s do
select x }
let find filterPredFn =
filterPredFn
|> fun fn s -> query { for x in s do
where (fn()) }
let getTop rowCount =
rowCount
|> fun cnt s -> query { for x in s do
take cnt }
在控制器中,我传递了所有必要的东西:
namespace Melopienso.Controllers
open System
open System.Web.Mvc
open Melopienso.Models
open Melopienso.Repositories
open Repository
open Utils
[<HandleError>]
type CategoriesController(context:IDisposable, ?repository) =
inherit Controller()
let fromRepository =
match repository with
| Some v -> v
| _ -> (context :?> MelopiensoEntities).Categories
|> Repository.get
new() = new CategoriesController(new MelopiensoEntities())
member this.Index () =
getAll() |> fromRepository |> this.View
override x.Dispose disposing =
context.Dispose()
base.Dispose disposing
[<HttpGet>]
member this.Create () =
this.View()
现在,当保存问题时,关键在于如何使其具有可重复使用性。如果我传递DbSet,我需要一种调用上下文的方法,但我不知道如何从特定的DbSet中找到它(甚至怀疑这是不可能的)。
如果我同时传递DbContext和DbSet,我无法执行类似以下操作的操作:
use nameOfDbContext
nameOfDbContext.NameOfDbSet.Add entity
我发现唯一的选项是硬编码任何内容,但这似乎不太合适。
很遗憾,但丹尼尔的优秀示例并没有以“传统”的EF方式进行保存,并使用总线等,这非常好,但我首先希望拥有一个完全工作的基本应用程序,然后再通过异步控制器、邮箱等进行改进。
任何提示将不胜感激。干杯!