Я работаю над прототипом для использования базы данных документов (в настоящее время MongoDB, возможно, изменится) и нашел драйверы .NET немного болезненными, поэтому я решил абстрагировать доступ к данным с помощью шаблона Repository.Это должно облегчить замену того драйвера, который я сейчас использую (NoRM, mongodb-csharp, simple-mongob), на ваш драйвер killer f # mongodb, который не сосет , когда он будет готов.
Мой вопрос касается операции Добавить .Это будет иметь некоторые побочные эффекты для базы данных, и, следовательно, последующие вызовы All будут другими.Должен ли я заботиться?В C # традиционно я бы этого не делал, но я чувствую, что в F # я должен.
Вот общий интерфейс репозитория:
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
А вот как выглядит реализация MongoDB:
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
Во всем приложении я буду использовать IRepository, что позволит легко менять драйверы и, возможно, базы данных.
Вызов Все в порядке, но с добавлением, что я надеялся, было вместо возврата модуля, returnновый экземпляр репозитория.Что-то вроде:
// 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>
Проблема в том, что если я вызываю Get, затем Add, исходный репозиторий по-прежнему возвращает все документы.Пример:
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()
В идеале я хочу, чтобы длина a1 и a2 была разной, но они одинаковы, поскольку они оба попадают в базу данных.Приложение работает, пользователи могут задать свой вопрос, но программисту задается вопросом, почему он возвращает новый IRepository.
Так что я должен пытаться справиться с побочным эффектом от Add для базы данных при разработкетипы?Как другие поступили бы по этому поводу, используете ли вы репозиторий или какой-то подобный интерфейсный класс или у вас есть какой-то лучший функциональный подход?