Sulla base dei grandi campioni da Daniel Mohl and his book.Risparmio EF con F # e ASP.NET MVC
Ho e applicazione ASP.NET MVC in F # con il modello online per esso. Finora ho il mio modello, entità, controller, repository, vista ... tutto molto generalizzato e riutilizzabile, e l'interrogazione è grande. Ma non riesco a trovare un modo per mantenere ugualmente riutilizzabile il salvataggio sulla parte DbContext.
Per la parte di query il codice per Repository.fs è la seguente
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 }
........... (più codice) ......... ..
E nel controller mi passa tutto il necessario:
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()
........... (più codice) ...........
Ora, quando si salva il problema si trova in come renderlo riutilizzabile come quello. Se passo il DbSet ho bisogno di un modo per chiamare il contesto, che non so come trovarlo dallo specifico DbSet (dubito che sia persino possibile).
Se mi passa sia la DbContext e DbSet, non posso fare qualcosa di simile
use nameOfDbContext
nameOfDbContext.NameOfDbSet.Add entity
L'unica opzione che trovo a hardcode nulla, ma che proprio non mi sembra giusto.
È un peccato, ma i grandiosi esempi di Daniel non fanno la parte di risparmio in un modo "tradizionale" EF e usano bus, ecc., Il che è ottimo ma prima vorrei avere un'applicazione di base pienamente funzionante, e quindi migliorare da lì con controller Async, caselle di posta, ecc.
Qualsiasi suggerimento sarebbe molto apprezzato. Saluti!
Ciao Danny! È passato molto tempo da quando ho pubblicato la sua e alla fine ho preso una strada completamente diversa, ma cercherò di dare un'occhiata perché di sicuro sarà preziosa per altri progetti. Molte grazie! –