using Raven.Client.Documents.Session; using System.Collections.Generic; using zero.Core.Options; namespace zero.Core.Database { public class ZeroStore : IZeroStore { public ZeroStore(IZeroDocumentStore raven, IZeroOptions options) : base() { Options = options; Raven = raven; //Database = null; } protected IZeroOptions Options { get; set; } protected Dictionary ScopedSessions { get; set; } = new(); /// public string ResolvedDatabase { get; set; } /// public IZeroDocumentStore Raven { get; private set; } /// public IZeroDocumentSession Session(string database = null, ZeroSessionResolution resolution = ZeroSessionResolution.Reuse, SessionOptions options = null) { database ??= ResolvedDatabase; options ??= new SessionOptions() { Database = database }; if (resolution == ZeroSessionResolution.Create) { return Raven.OpenAsyncSession(options) as IZeroDocumentSession; } if (!ScopedSessions.TryGetValue(database, out IZeroDocumentSession session)) { session = Raven.OpenAsyncSession(options) as IZeroDocumentSession; ScopedSessions.TryAdd(database, session); } if (session.IsDisposed) { session = Raven.OpenAsyncSession(options) as IZeroDocumentSession; ScopedSessions.Remove(database); ScopedSessions.TryAdd(database, session); } return session; } /// public IZeroDocumentSession Session(bool global, string database = null, ZeroSessionResolution resolution = ZeroSessionResolution.Reuse, SessionOptions options = null) { return Session(global ? Options.Raven.Database : database, resolution, options); } } public enum ZeroSessionResolution { Reuse = 0, Create = 1 } public interface IZeroStore { /// /// The database which has been resolved from the current application /// string ResolvedDatabase { get; set; } /// /// Get underlying raven document store /// IZeroDocumentStore Raven { get; } /// /// Use a specific session /// IZeroDocumentSession Session(string database = null, ZeroSessionResolution resolution = ZeroSessionResolution.Reuse, SessionOptions options = null); /// /// Use a session for the core database /// IZeroDocumentSession Session(bool global, string database = null, ZeroSessionResolution resolution = ZeroSessionResolution.Reuse, SessionOptions options = null); } }