Estoy trabajando en un prototipo para usar una base de datos documental (actualmente MongoDB, puede cambiar) y encontré los controladores .NET un poco molestos, así que pensé en abstraer el acceso a los datos con el Repositorio patrón. Esto debería facilitar el intercambio del controlador que estoy usando ahora (NoRM, mongodb-csharp, simple-mongob) con tu controlador f # mongodb asesino que no absorbe cuando está listo.Patrón de repositorio en F #
Mi pregunta es sobre el Operación Agregar. Esto tendrá un efecto secundario en la base de datos y, por lo tanto, las llamadas subsiguientes a Todas serán diferentes. ¿Debería importarme? En C# tradicionalmente no lo haría, pero siento que en F # debería.
Aquí es la interfaz de repositorio genérico:
type IRepository<'a> =
interface
abstract member All : unit -> seq<'a>
// Add has a side-effect of modifying the database
abstract member Add : 'a -> unit
end
Y aquí es cómo una aplicación MongoDB se ve:
type Repository<'b when 'b : not struct>(server:MongoDB.IMongo,database) =
interface IRepository<'b> with
member x.All() =
// connect and return all
member x.Add(document:'b) =
// add and return unit
A lo largo de la aplicación voy a utilizar IRepository, por lo que es fácil cambiar los conductores y potencialmente bases de datos.
Llamando Todo está bien, pero con Agregar lo que esperaba era en lugar de devolver la unidad, devuelva una nueva instancia de repositorio. Algo así como:
// Add has a side-effect of modifying the database
// but who cares as we now return a new repository
abstract member Add : 'a -> IRepository<'a>
El problema es que si llamo Obtener, a continuación, Añadir, el repositorio original todavía devuelve todos los documentos. Ejemplo:
let repo1 = new Repository<Question>(server,"killerapp") :> IRepository<Question>
let a1 = repo1.All()
let repo2 = repo1.Add(new Question("Repository pattern in F#"))
let a2 = repo2.All()
Idealmente quiero longitud de a1 y a2 a ser diferente, pero que son los mismos que los dos se golpean la base de datos. La aplicación funciona, los usuarios pueden hacer su pregunta, pero el programador se pregunta por qué devuelve un nuevo IRepository.
¿Debo tratar de manejar el efecto secundario de Añadir en la base de datos en el diseño de los tipos? ¿Cómo podrían otros hacer esto? ¿Usan un Repositorio o alguna clase de interfaz como esta o tienen un enfoque funcional mejor?
De lo que estás hablando, MongoDB no es compatible, pero la idea sigue siendo interesante, y existe al menos una implementación. Eche un vistazo a http://www.datomic.com/. –