Git Product home page Git Product logo

neventstore's Introduction

NEventStore

NEventStore is a persistence library used to abstract different storage implementations when using event sourcing as storage mechanism.

This library is developed with a specific focus on DDD/CQRS applications.

NEventStore currently supports:

  • .net standard 2.0
  • .net framework 4.6.2

Starting from Version 6.0.0 NEventStore will use Semantic Versioning to track the version numbers.

Build Status (AppVeyor)

Branches:

  • master Build status
  • develop Build status

Main Library Packages

  • NEventStore - the core library package.
  • NEventStore.Serialization.Json - Json serialization to be used with an IDocumentSerializer.
  • NEventStore.Serialization.Bson - BSon serialization to be used with an IDocumentSerializer.
  • NEventStore.PollingClient - provides an implementation for a PollingClient.

Documentation

Please see the documentation to get started and for more information.

ChangeLog can be found here

Developed with:

Resharper TeamCity dotCover dotTrace

How to build (Windows OS)

To build the project locally on a Windows Machine:

  • Open a Powershell console in Administrative mode and run the build script build.ps1 in the root of the repository.

Vesioning

Versioning is done automatically by the build script updating the AssemblyInfo.cs file (false in .csproj files) before the build starts. The version number is retrieved from the git repository tags using "gitversion" tool.

Things are handled this way because NEventStore is used a submodule in other projects and it need to have it's own version number when building other projects.

You should not update the version number manually, not commit the updated AssemblyInfo files.

neventstore's People

Contributors

agiorgetti avatar aleksandrov avatar alkampfergit avatar almazik avatar andreabalducci avatar captaincodeman avatar christophdebaene avatar damianh avatar danielmarbach avatar evgeny-myasishchev avatar friism avatar haf avatar hyrmn avatar jjrdk avatar kblooie avatar marnix avatar mattjohnsonpint avatar mbp avatar mihasic avatar pcoombe avatar pgermishuys avatar pjvds avatar saintgimp avatar seburgi avatar szymonpobiega avatar tigraine avatar tt avatar tyronegroves avatar valeriob avatar ymotton avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

neventstore's Issues

Excessive memory usage

I know that's a little vague but if you insert lots (>100000) of events in a loop using sql persistence, I notice lots of memory is used and not freed up. I reused the same eventstore instance during my test.

I observed this behavior using a compiled version of 403e4ce

I managed to setup a memory profiling session using dotTrace's memory profiler. The TrackStream seems to have moved into the OptimisticPipelineHook, which is the culprit of all this. It keeps an ever growing list around of streams and corresponding events.

REMARK: Duplicate of issue #34 which was unwillingly closed.

[Non-issue] Verify Threading of OptimisticEventStore and CommitTracker during PersistAndDispatch

The CommitTracker (which internally is multi-threaded) is simply a performance heuristic for most implementations and really helps against storage that doesn't contain a secondary index...

If an attempt to commit/dispatch occur simultaneously for the same stream, the storage mechanism is responsible for failing the insert on one and raising a concurrency exception back to the caller.

TODO: Polling Dispatchers

Async and Sync dispatchers should have some kind of polling mechanism to get undispatched commits to dispatch them. This allows us to add commits to the repository and have the dispatcher automatically pick it up and publish it.

TODO: REST, HTTP, Client/ServerPersistenceEngine

Create a PersistenceEngine implementation that can be exposed as an endpoint, e.g. REST or HTTP, etc. such that the OptimisticEventStore could use that endpoint as the underlying storage. This would create a logical layering point which could then be separated into physical layers more easily.

Expose time of commit for event messages

The time of a commit is persisted for all event messages, but there seems to be no way to retrieve the commit stamp together with the actual events for a particular stream.

I know I could just persist the same information in the header, but I'd like to leave this responsibility to EventStore.

In my current use case, I'm looking to use the time to calculate the length of subscriptions, but I can also see it being valuable for presenting a log of events related to a given stream.

Publish mongo persistence to nuget?

I'd like to use mongodb for event storage in my application. I see the Raven implementation on nuget, but I can't find the mongo one. Is that up on nuget yet? Any chance you could publish it if it's not already there?

TIA

SqlException analysis on non-english servers

This will not work when one is using the store with say a French MS Sql Server (although you could trick the connection into using English as it's language).

In type EventStore.Persistence.SqlPersistence.SqlDialects.CommonDbStatement:

    protected virtual bool IsDuplicate(Exception exception)
    {
        string message = exception.Message.ToUpperInvariant();
        if (!message.Contains("DUPLICATE"))
        {
            return message.Contains("UNIQUE");
        }
        return true;
    }

Excessive memory usage

I know that's a little vague but if you insert lots (>100000) of events in a loop using sql persistence, I notice lots of memory is used and not freed up. I'm not sure it's an actual issue, just weird that it keeps growing. At first I thought it was the tracker, but that seems gone from the source. I must be doing something wrong ...

I observed this behavior using a compiled version of 403e4ce

Code I used during which the behavior was observed (.NET 4.0):

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Threading.Tasks;
    using EventStore;

    namespace PerfWise {
      class Program {
        static void Main(string[] args) {
          var store = Wireup.Init().
            UsingSqlPersistence("eStore").InitializeDatabaseSchema().
            UsingServiceStackJsonSerialization().Build();

          var thousandSchedulesWith5YearsWorthOfData = 365*5*1000;
          var watch = Stopwatch.StartNew();
          var start = DateTime.Now;
          Parallel.For(
            0,
            thousandSchedulesWith5YearsWorthOfData,
            new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
            i => {
              Console.WriteLine("Writing {0}", i);
              var streamId = Guid.NewGuid();
              using (var stream = store.CreateStream(streamId)) {
                stream.Add(new EventMessage {
                  Body = new ScheduleDayCreatedEvent(streamId, 1, Guid.NewGuid(), DateTime.Today.AddDays(i),
                    new[] {
                           new ScheduleDaySessionData(1, TimeSpan.Parse("08:00:00"), TimeSpan.Parse("12:00:00"), "Morning", "Morn", 1.1, Guid.NewGuid(), 
                             new [] {
                                      new ScheduleDayProgramData(1, TimeSpan.Parse("08:00:00"), TimeSpan.Parse("12:00:00"), 2, Guid.NewGuid())
                                    }
                             ), 
                          new ScheduleDaySessionData(2, TimeSpan.Parse("14:00:00"), TimeSpan.Parse("17:00:00"), "Afternoon", "Aft", 1.2, Guid.NewGuid(), 
                             new [] {
                                      new ScheduleDayProgramData(1, TimeSpan.Parse("14:00:00"), TimeSpan.Parse("17:00:00"), 1.5, Guid.NewGuid())
                                    }
                             ), 
                  })
                });
                stream.CommitChanges(Guid.NewGuid());
              }
            });
          watch.Stop();
          var end = DateTime.Now - start;
          Console.WriteLine("Done in (stopwatch) {0}ms or (datetime) {1}ms.", watch.ElapsedMilliseconds, end.TotalMilliseconds);
          Console.ReadLine();
        }
      }

      public class ScheduleDayCreatedEvent : IEvent {
        public Guid ScheduleDayId { get; private set; }
        public long Version { get; private set; }
        public Guid ScheduleId { get; private set; }
        public DateTime Date { get; private set; }
        public ICollection<ScheduleDaySessionData> Sessions { get; private set; }

        public ScheduleDayCreatedEvent(Guid scheduleDayId, long version, Guid scheduleId, DateTime date, ICollection<ScheduleDaySessionData> sessions) {
          ScheduleDayId = scheduleDayId;
          Version = version;
          ScheduleId = scheduleId;
          Date = date;
          Sessions = sessions;
        }
      }

      public class ScheduleDaySessionData {
        public int SessionSequence { get; private set; }
        public TimeSpan From { get; private set; }
        public TimeSpan To { get; private set; }
        public string Name { get; private set; }
        public string Abbreviation { get; private set; }
        public double MaximumFillPercentage { get; private set; }
        public Guid LocationId { get; private set; }
        public ICollection<ScheduleDayProgramData> Programs { get; private set; }

        public ScheduleDaySessionData(int sessionSequence, TimeSpan from, TimeSpan to, string name, string abbreviation, double maximumFillPercentage, Guid locationId, ICollection<ScheduleDayProgramData> programs) {
          SessionSequence = sessionSequence;
          From = from;
          To = to;
          Name = name;
          Abbreviation = abbreviation;
          MaximumFillPercentage = maximumFillPercentage;
          LocationId = locationId;
          Programs = programs;
        }
      }

      public class ScheduleDayProgramData {
        public int ProgramSequence { get; private set; }
        public TimeSpan From { get; private set; }
        public TimeSpan To { get; private set; }
        public double MaximumFillPercentage { get; private set; }
        public Guid ProgramId { get; private set; }

        public ScheduleDayProgramData(int programSequence, TimeSpan from, TimeSpan to, double maximumFillPercentage, Guid programId) {
          ProgramSequence = programSequence;
          From = from;
          To = to;
          MaximumFillPercentage = maximumFillPercentage;
          ProgramId = programId;
        }
      }

      public interface IEvent {}
    }

Add Logging Messages

Now that logging capability exists, the various components need to have logging messages added.

Cassandra storage engine

first off, great work! I'm on a project that's implemented EventStore using the sql engine just to get up and running. we are using cassandra as a read repo throughout the app and were hoping to use it for event storage as well. Is there any roadmap for the cassandra storage engine? if not we would happily supply a pull request. thanks

RavenPersistenceEngine only returns the 128 first documents

From http://ravendb.net/documentation/safe-by-default

On the client side, if you fail to specify the page size (by using the Take() method), it will use a page size of 128 by default.

This is exactly the case for RavenPersistenceEngine, resulting in only the first 128 commits being returned.

A solution that might be too naive, but is one that works is to add .Take(int.MaxValue) to the query before it's returned in the RavenPersistenceEngine.Query().

DuplicateCommitException not expected

I reran my sample (inserting 1825000 commits) and got the following weird exception at the 1820207th commit (there goes my timing :().
What's weird about it is that it's masking a timeout as a duplicate commit.

  System.AggregateException was unhandled
    Message=One or more errors occurred.
    Source=mscorlib
    StackTrace:
         at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
         at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
         at System.Threading.Tasks.Parallel.ForWorker[TLocal](Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body, Action`2 bodyWithState, Func`4 bodyWithLocal, Func`1 localInit, Action`1 localFinally)
         at System.Threading.Tasks.Parallel.For(Int32 fromInclusive, Int32 toExclusive, ParallelOptions parallelOptions, Action`1 body)
         at PerfWise.Program.Main() in D:\workspace\git\PerfWise\Program.cs:line 16
    InnerException: EventStore.DuplicateCommitException
         Message=Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
         Source=EventStore
         StackTrace:
              at EventStore.Persistence.SqlPersistence.SqlDialects.CommonDbStatement.ExecuteNonQuery(String commandText) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlDialects\CommonDbStatement.cs:line 77
              at EventStore.Persistence.SqlPersistence.SqlDialects.CommonDbStatement.Execute(String commandText) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlDialects\CommonDbStatement.cs:line 65
              at EventStore.Persistence.SqlPersistence.SqlPersistenceEngine.<>c__DisplayClassa.<Commit>b__9(IDbStatement cmd) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlPersistenceEngine.cs:line 91
              at EventStore.Persistence.SqlPersistence.SqlPersistenceEngine.ExecuteCommand(Guid streamId, Action`1 command) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlPersistenceEngine.cs:line 192
              at EventStore.Persistence.SqlPersistence.SqlPersistenceEngine.Commit(Commit attempt) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlPersistenceEngine.cs:line 80
              at EventStore.OptimisticEventStore.EventStore.ICommitEvents.Commit(Commit attempt) in d:\workspace\git\EventStore\src\proj\EventStore.Core\OptimisticEventStore.cs:line 65
              at EventStore.OptimisticEventStream.PersistChanges(Guid commitId) in d:\workspace\git\EventStore\src\proj\EventStore.Core\OptimisticEventStream.cs:line 127
              at EventStore.OptimisticEventStream.CommitChanges(Guid commitId) in d:\workspace\git\EventStore\src\proj\EventStore.Core\OptimisticEventStream.cs:line 106
              at PerfWise.Program.<>c__DisplayClass3.<Main>b__2(Int32 i) in D:\workspace\git\PerfWise\Program.cs:line 39
              at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
              at System.Threading.Tasks.Task.InnerInvoke()
              at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
              at System.Threading.Tasks.Task.<>c__DisplayClass7.<ExecuteSelfReplicating>b__6(Object )
         InnerException: System.Data.SqlClient.SqlException
              Message=Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
              Source=.Net SqlClient Data Provider
              ErrorCode=-2146232060
              Class=11
              LineNumber=0
              Number=-2
              Procedure=""
              Server=.\SQLEXPRESS
              State=0
              StackTrace:
                   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
                   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
                   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
                   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
                   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
                   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
                   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
                   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
                   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
                   at EventStore.Persistence.SqlPersistence.SqlDialects.CommonDbStatement.ExecuteNonQuery(String commandText) in d:\workspace\git\EventStore\src\proj\EventStore.Persistence.SqlPersistence\SqlDialects\CommonDbStatement.cs:line 72
              InnerException: 

Lambda based fluent interface instead of indent based?

The current fluent interface uses indents to seperate its subdependencies. But that its prolematic if you do a reformat.
What is your opinion on lamdba based fluent interfaces?

var store = Wireup.Init()
    .UsingSqlPersistence("Name Of EventStore ConnectionString In Config File",x=>{
        x.InitializeStorageEngine();
        x.UsingJsonSerialization(s=>{
            s.Copress();
            s.EncryptWith(EncryptionKey);
        })
    })
    .HookIntoPipelineUsing(new[] { new AuthorizationPipelineHook() })
    .UsingAsynchronousDispatchScheduler(x=>{
      x.DispatchTo(new My_NServiceBus_Or_MassTransit_OrEven_WCF_Adapter_Code());
    })
    .Build();

GetFrom(...) for SQL

Modify GetFrom to be more iterator friendly, e.g. Go and get 100+ commits from the DB and when the iterator is exhausted, go and get 100 more.

CommitStamp

When dealing with a large set of rows, commitstamp is not very queryable. It takes way too long because there's no index on it. I don't know if this is intentional (i.e. should only be seen as a commit attribute and not something one should query on). OTOH, putting an index on a datetime column is not advisable. Not really sure, what I'm trying to say here. I wanted to use the commitstamp as a way to time the process of inserting a large batch of commits.

ravenpersistence with ambient txn attempts to access aborted txn

Trying out RavenPersistence with the EnlistInAmbientTrans feature turned on.

I noticed when there is a an concurrencyexception in the RavenPersistenceEngine.Commit()
method it call the LoadSavedCommit() method in the catch block.

LoadSaveCommit() attempts to go back to the database to grab some details which then throws a
second "Transaction Aborted Event" exception presumably because the transaction has already
failed on the previous db call.

This hides the real error (concurrencyexception) and does not seem like the desired behaviour.

strange paging behavior

Sql Store:

SELECT COUNT(*)
FROM [Commits]
WHERE CommitStamp>'2011-10-20'
RESULT IS: 10930

EventStore 3.0.11293.43:
var store = Wireup.Init()
.UsingSqlPersistence("Sql")
.InitializeStorageEngine()
.UsingJsonSerialization()
.Build();

        var enumerable = store.Advanced.GetFrom(new DateTime(2011, 10, 20)).ToList();
        Console.WriteLine(enumerable.Count);

RESULT IS: 614

Problem Is 614 != 10930

"Race condition" on in-memory dictionary of streams

It is possible to have save events to a stream, that stream having been committed to DB and that commit dispatched using a synchronous scheduler without the internal event store being consistent at just before any of those two events (commit, dispatch). The code is built against joliver/master/HEAD, so it's ES3.0beta.

Se the below log:

14:57:51.4893|INFO|EventStore.OptimisticEventStore|13|Committing attempt 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8' which contains 1 events to the underlying persis
tence engine.
14:57:51.4893|TRACE|EventStore.Serialization.ByteStreamDocumentSerializer|13|Serializing object graph of type 'System.Collections.Generic.List`1[EventStore.Even
tMessage]'.
14:57:51.4893|TRACE|EventStore.Serialization.JsonSerializer|13|Serializing object graph of type 'System.Collections.Generic.List`1[EventStore.EventMessage]'.
14:57:51.4893|TRACE|EventStore.Serialization.JsonSerializer|13|The object to be serialized is of type 'System.Collections.Generic.List`1[EventStore.EventMessage
]'.  Using an untyped serializer for the known type.
14:57:51.5693|DEBUG|EventStore.OptimisticEventStore|13|Pushing commit 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8' to post-commit hook of type 'EventStore.OptimisticP
ipelineHook'.
14:57:51.5693|TRACE|EventStore.OptimisticPipelineHook|13|Tracking commit 1 on stream 'e2af5b6d-2210-4ed6-86db-07b639ae4dc5'.
14:57:51.5693|DEBUG|EventStore.OptimisticEventStore|13|Pushing commit 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8' to post-commit hook of type 'EventStore.DispatchSch
edulerPipelinkHook'.
14:57:51.5693|INFO|EventStore.Dispatcher.SynchronousDispatchScheduler|13|Scheduling commit 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8' to be dispatched.
14:57:51.5693|INFO|EventStore.Dispatcher.SynchronousDispatchScheduler|13|Marking commit 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8' as dispatched.
14:57:51.5833|TRACE|Infrastructure.Persistence.EventStore.EventStoreRepository|25|GetById<MyWorkflow> id#'e2af5b6d-2210-4ed6-86db-07b639ae4dc5', v
ersion#1
14:57:51.5833|DEBUG|Infrastructure.Persistence.EventStore.EventStoreRepository|25|opening stream#e2af5b6d-2210-4ed6-86db-07b639ae4dc5 @ versio
n 1
14:57:51.5833|DEBUG|MyWorkflow|25|Initialization done. Current status is 'WorkflowStatus.Uninitialized'
14:57:51.5833|DEBUG|Infrastructure.Persistence.EventStore.EventStoreRepository|25|ApplyEventsToAggregate: aggregate#e2af5b6d-2210-4ed6-86db-07
b639ae4dc5
14:57:51.5833|INFO|MyWorkflow|25|MyWorkflow#00000000-0000-0000-0000-000000000000 second in workflow called
14:57:51.5833|WARN|MyWorkflow|25|cannot fire trigger Second, because there are no valid leaving transition from Uninitialized
14:57:51.6073|TRACE|EventStore.OptimisticEventStream|13|Adding commit 'd70ad0c5-cdad-4ce8-bdb9-9f6400f69aa8 with 1 events to stream 'e2af5b6d-2210-4ed6-86db-07b
639ae4dc5'.
14:57:51.6073|DEBUG|EventStore.OptimisticEventStream|13|Clearing all uncommitted changes on stream 'e2af5b6d-2210-4ed6-86db-07b639ae4dc5'.
... The AR: crash-and-burn

Suggestion; update in memory cache of streams before dispatching, after committing.

Auto clearing of old snapshots

I'd like the option to configure a persistence engine to automatically remove old snapshots for a stream once a new snapshot has been generated for that stream. I'd be happy to contribute this if others think it would be a helpful contribution to the project.

Use DateTimeOffset instead of DateTime in API

I run into the problem that i dont get my events because the event store stores timestamp correctly in UtcNow and so i dont get the correct results when i am use DateTime.Now.

This could be prevented if the API uses DateTimeOffset instead of DateTime like RX it dose.

File System Persistence Engine

Not exactly an issue... I'm looking for something to do this weekend and wanted to take a stab at this. Wanted to know if a pull request on this would be welcome.

BsonSerializer DateTime handling

BsonSerializer doesn't correctly encode UTC value into serialized dates and incorrectly deserializes them according to UTC time thereafter--even if they were already UTC values.

ILMerge-ing of raven assemblies

Hi,

Do you think it's a good idea to merge the raven assemblies in the RavenPersistence assembly (without internalzing them)? Do you think it's that much trouble for the users to add the assemblies themselves to their projects where required or do you have any other reason for the merge?

I've written a RavenDb subscription storage for NanoMessageBus and it seems that i can't use it in a project where i've already referenced the EventStore RavenPersistence assembly.

Thanks,
Iulian

TODO: Mongo and Raven persistence

Mongo and Raven don't need to "pre-serialize" the event message bodies--they can just leave them as object and let the default serializers do their thing.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.