Архитектура доступа к данным с Raven DB - PullRequest
12 голосов
/ 06 мая 2011

Какие архитектуры доступа к данным доступны для использования с Raven DB?

По сути, я хочу отделить персистентность через интерфейсы, чтобы не предоставлять хранилище подчеркивания верхним уровням. То есть Я не хочу, чтобы в моем домене отображалось IDocumentStore или IDocumentSession из базы данных Raven.

Я реализовал шаблон общего хранилища, и это, похоже, работает. Однако я не уверен, что это действительно правильный подход. Может быть, я пойду к разделению командных запросов или как-то еще?

Что ты думаешь?

Ответы [ 2 ]

6 голосов
/ 10 мая 2011

Лично я не очень разбираюсь в шаблонах команд. Я видел, что это использовалось в превосходном учебнике Роба Эштона .

Для себя я попытаюсь использовать следующее: -

  • Шаблон репозитория (как вы сделали)
  • Внедрение зависимостей с StructureMap
  • Moq для пробного тестирования
  • Служебный уровень для изоляции бизнес-логики (здесь нет уверенности в шаблоне .. или даже если это шаблон.

Поэтому, когда я захочу получить какие-либо данные из RavenDB (источника постоянных данных), я буду использовать службы, которые затем будут вызывать соответствующий репозиторий. Таким образом, я не открываю хранилище для Приложения, и при этом хранилище не является слишком тяжелым или сложным -> это в основном FindAll / Save / Delete.

например.

public SomeController(IUserService userService, ILoggingService loggingService)
{
    UserService = userService;
    LoggingService = loggingService;
}

public ActionMethod Index()
{
   // Find all active users, page 1 and 15 records.
    var users = UserService.FindWithIsActive(1, 15);         
    return View(new IndexViewModel(users));
}

public class UserService : IUserService
{
    public UserService(IGenericReposistory<User> userRepository, 
                       ILoggingService loggingService)
    {
        Repository = userRepository;
        LoggingService = loggingService;
    }

    public IEnumberable<User> FindWithIsActive(int page, int count)
    {
        // Note: Repository.Find() returns an IQueryable<User> in this case.
        //       Think of it as a SELECT * FROM User table, if it was an RDMBS.
        return Repository.Find() 
            .WithIsActive()
            .Skip(page)
            .Take(count)
            .ToList();
    }
}

Так что это очень простой и надуманный пример без проверки ошибок / проверки, try / catch и т. Д. ... и псевдокода ... но вы можете увидеть, как сервисы rich , пока хранилище (предположительно, по крайней мере для меня) просто или легче . И тогда я только выставляю любые данные через сервисы.

Это то, что я делаю прямо сейчас с .NET и Entity Framework, и я буквально через несколько часов могу сделать это с RavenDb (WOOT!)

2 голосов
/ 08 мая 2011

Чего вы пытаетесь достичь этим?

Вы не можете создать приложение, которое использует как RDBMS, так и DocDB, по крайней мере, неэффективно. Вы должны решить для себя, какую базу данных вы собираетесь использовать, а затем пройти весь путь с ней. Если вы решили использовать RDMBS, вы можете, например, использовать NHibernate, а затем снова - нет необходимости в каком-либо другом уровне абстракции.

...