Я внедряю RavenDB в проект, и через несколько дней, пробуя базу данных, я сейчас структурирую это приложение, но у меня есть вопрос.
Я пишу бизнес-уровни для каждой сущности (почти), и у меня есть уникальный класс репозитория, который обрабатывает запросы и DocumentStore. Я смущен тем, как я должен совместно использовать DocumentStore по слоям служб и обрабатывать транзакции.
Я показываю пример, в котором я пытаюсь сохранить и прочитать документ в одной транзакции.
Пример репозитория:
public class RavenRepository
{
private static DocumentStore _store;
private IDocumentSession _session;
public RavenRepository(DocumentStore store)
{
_store = (_store==null) ? new DocumentStore() { Url = "http://wsk-gcardoso:8081" } : store;
}
public T SingleOrDefault<T>(Func<T, bool> predicate) where T : BaseModel
{
using (var session = _store.OpenSession())
{
return session.Query<T>().SingleOrDefault(predicate);
}
}
public T Add<T>(T item) where T : BaseModel
{
using (var session = _store.OpenSession())
{
session.Advanced.AllowNonAuthoritiveInformation = this.AllowNonAuthoritiveInformation;
session.Store(item);
session.SaveChanges();
}
return item;
}
public void Initialize() {
_store.Initialize();
}
public void Dispose() {
_store.Dispose();
}
}
Бизнес-уровень будет таким:
public class NewsletterBusiness
{
private RavenRepository repository;
public NewsletterBusiness(RavenRepository ravenRepository)
{
repository = (ravenRepository == null) ? RavenRepository(null) : ravenRepository;
}
public Newsletter Add(Newsletter newsletter)
{
Newsletter news = repository.Add(newsletter);
return news;
}
public Newsletter GetById(long Id)
{
Newsletter news = repository.SingleOrDefault<Newsletter>(x => x.Id == Id);
return news;
}
}
Теперь я пытаюсь сохранить и прочитать объект (бюллетени) в той же транзакции. Из того, что я прочитал, я должен установить для параметра AllowNonAuthoritativeInformation в хранилище документов значение false, чтобы дождаться завершения транзакции. Но судя по тому, как я работаю со слоями и репозиторием, могу ли я хранить и запрашивать базу данных в одной транзакции?
Честно говоря, я думаю, что меня смущает метод хранения OpenSession. Я думаю, что путаю сеанс с транзакцией.
Например, этот код:
var repository = new RavenRepository(null);
newsletterBusiness = new NewsletterBusiness(repository);
repository.Initialize();
using (var tx = new TransactionScope())
{
Newsletter new = newsletterBusiness.Add(new Newsletter { Title = "Created by Tests", Content = "Created By Tests" });
Newsletter objectCreated = newsletterBusiness.GetById(new.Id);
repository.Dispose();
tx.Complete();
}
Если я создам второй бизнес-уровень (например, для изображений) и установлю picturesBusiness.repository = репозиторий (тот же объект RavenRepository, установленный для бизнес-уровня), я буду работать в том же сеансе бюллетеньBusiness.repository?
picturesBusiness = new PicturesBusiness(repository);
Picture pic = picturesBusiness.GetById(20);
Я был бы очень признателен за помощь по этому вопросу, Привет из Португалии!