基于Daniel Mohl 和他的书中的优秀样本。
我有 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
我发现硬编码任何东西的唯一选择,但这似乎并不正确。
很遗憾,但 Daniel 的优秀示例并没有以“传统”EF 方式进行节省部分并使用总线等,这很好,但我首先希望有一个基本应用程序完全工作,然后从那里使用 Async 进行改进控制器、邮箱等
任何提示将不胜感激。干杯!