Статьи

Использование RavenDB с ASP.NET MVC


Традиционно, когда вы думаете о базе данных, вы думаете о таблицах, представлениях, индексах и хранимых процедурах.
Если вы сделали карьеру в разработке приложений, ориентированных на базы данных, как я, то есть вероятность, что вы потратили много времени на решение проблем, связанных с целостностью ссылок, нормализацией и производительностью.

Если вы не жили под камнем, то вы, вероятно, слышали о новейшем тренде баз данных под названием NoSQL. NoSQL относится к нереляционным базам данных документов, которые помогают решать такие проблемы, как производительность и масштабируемость, которые часто трудно достичь при использовании традиционных систем баз данных, таких как SQL или Oracle. NoSQL заменяет старую мантру об управлении базами данных на «масштабирование» новой: «масштабирование». Вместо добавления серверов большего размера для обработки большей загрузки данных база данных NoSQL позволяет компании распределять нагрузку по нескольким хостам по мере увеличения нагрузки. Если вам интересно, многие успешные компании, такие как Amazon, BBC, Facebook и Google уже полагаются на базы данных NoSQL для повседневной работы.

Если вы выполните быстрый поиск в Интернете, вы обнаружите, что есть много баз данных документов на выбор. Некоторые из самых популярных вариантов сегодня — MongoDB , CouchDB и RavenDB . По какой-то причине меня привлекла RavenDB, потому что я знал, что она легко интегрируется с платформой .NET / windows. Как всегда, лучший способ научиться чему-либо — это сначала прыгнуть в голову. Поэтому следующая статья представляет собой пошаговое руководство по созданию веб-приложения MVC 2 с использованием RavenDB в качестве бэкэнда.

 

Установка RavenDB

  • Загрузите последние версии с сайта RavenDB . Для простоты распакуйте файлы в C: \ Raven.
  • В моем примере я настроил RavenDB как приложение IIS. Вот шаги, которые я предпринял прямо с сайта RavenDB:

    • Распакуйте дистрибутив zip.
    • В диспетчере IIS создайте новый веб-сайт и укажите его физический путь к папке «/ Web» в извлеченной папке.
    • Установите для пула приложений значение «ASP.Net v4.0» (или создайте новый пул приложений с установленным интегрированным конвейером .NET 4.0).
    • Установите порт и хост, если они вам нужны.
    • Убедитесь, что у пользователя, которого вы выбрали для сайта, есть доступ на запись к физическому расположению базы данных.
  • Наконец, убедитесь, что у вас есть права на чтение / запись в папку «c: \ Raven \ Web \ Data».

После того, как все настроено, вы сможете открыть браузер и просмотреть консоль RavenDB:

образ

Использование RavenDB с ASP.NET MVC

После создания веб-приложения ASP.NET MVC в первую очередь необходимо добавить ссылку на сборку C: \ Raven \ Client \ Raven.Client.Lightweight.dll.

Во-вторых, вам нужно инициализировать клиента. Согласно документации, объект DocumentStore должен создаваться только один раз для каждого приложения. Поэтому я настроил свое хранилище документов в событии Application_Start моего приложения MVC:

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterRoutes(RouteTable.Routes);

var documentStore = new Raven.Client.Document.DocumentStore { Url = "http://localhost:8080" };
documentStore.Initialize();
Application["DocumentStore"] = documentStore;

ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));
}

На данный момент у вас есть инициализированный клиент, и вы можете начать доступ к данным. Тем не менее, я решил обернуть свои звонки в классе репозитория. Мой класс репозитория реализует интерфейс, поэтому я могу легко создать «фальшивый» репозиторий для целей модульного тестирования. Как хорошая практика, я обычно создаю базовый контроллер, который принимает объект IRepository в качестве параметра. Это простая форма внедрения зависимостей, которая пригодится при создании модульных тестов в дальнейшем. В любом случае, код репозитория, который я придумал, очень прост и понятен. API Raven использует LINQ, поэтому разработчик .NET должен чувствовать себя как дома. Как вы увидите ниже, конструктор класса RavenRepository принимает DocumentStore, который был создан во время события Application_Start. Вот код:

public class RavenRepository : IRepository
{
private DocumentStore _store;
private IDocumentSession _session;

public RavenRepository(DocumentStore store)
{
_store = store;
_session = _store.OpenSession();
}

public T SingleOrDefault<T>(Func<T, bool> predicate) where T : IModel
{
return _session.Query<T>().SingleOrDefault(predicate);
}

public IEnumerable<T> All<T>() where T : IModel
{
return _session.Query<T>();
}

public void Add<T>(T item) where T : IModel
{
_session.Store(item);
}

public void Delete<T>(T item) where T : IModel
{
_session.Delete(item);
}

public void Save()
{
_session.SaveChanges();
}
}

Теперь, когда репозиторий создан, нам нужно создать несколько моделей для использования с ним. Вот простой класс Person. Я также добавил несколько аннотаций данных, чтобы упростить проверку и форматирование в MVC.

public class Person : IModel
{
public string Id { get; set; }

[DisplayName("First Name")]
[Required(ErrorMessage="*")]
public string FirstName { get; set; }

[DisplayName("Last Name")]
[Required(ErrorMessage = "*")]
public string LastName { get; set; }

[Required(ErrorMessage = "*")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}

Чтобы понять, как работает репозиторий, давайте взглянем на методы Create и Edit, которые я создал в PersonController. Действие создания очень простое: вы создаете нового пользователя, добавляете его в хранилище и затем сохраняете свои изменения:

public ActionResult Create()
{
var model = new PersonViewModel();
return View(model);
}

[HttpPost]
public ActionResult Create( PersonViewModel input )
{
var person = new Person
{
FirstName = input.Person.FirstName,
LastName = input.Person.LastName,
Email = input.Person.Email
};

_repository.Add(person);
_repository.Save();
TempData["Message"] = "Person created successfully";
return RedirectToAction("Index");
}

Редактировать так же просто, вы извлекаете запись из репозитория, обновляете свойства и сохраняете:

public ActionResult Edit(string id)
{
var model = new PersonViewModel(_repository,id);

if (model.Person == null) return View("NotFound");

return View(model);
}

[HttpPost]
public ActionResult Edit(string id, PersonViewModel input)
{
var person = _repository.SingleOrDefault<Person>(x => x.Id == id);
person.FirstName = input.Person.FirstName;
person.LastName = input.Person.LastName;
person.Email = input.Person.Email;
_repository.Save();

TempData["Message"] = "Person updated successfully";
return RedirectToAction("Index");
}

Вывод

Базы данных документов чрезвычайно просты в использовании, настройке и разработке. Тот факт, что вы можете создать объект и поместить его в базу данных без необходимости дурачиться с сопоставлением объекта с таблицей, является абсолютно фантастическим! Демо-проект прилагается.

RavenDbDemo.zip (114,69 кб)