private void HandleEvent(IEvent @event)
        {
            var eventHandler = GrainInternalEventHandlerProvider.GetInternalEventHandler(this.GetType(), @event.GetType());

            if (eventHandler == null)
            {
                throw new Exception(string.Format("Could not find event handler for [{0}] of [{1}]", @event.GetType().FullName, this.GetType().FullName));
            }
            eventHandler.Invoke(this, @event);

            if (this.State.Version + 1 != @event.Version)
            {
                throw new Exception(string.Format("inlidate event apply,the event id is {0},", @event.GetType().FullName, this.GetType().FullName));
            }
            //event id is the state's next version number
            this.State.Version = @event.Version;
        }
        public EventSourcingGrain()
        {
            var assembly = this.GetType().Assembly;

            if (!registerAssembly.Contains(assembly.FullName))
            {
                lock (lockObj)
                {
                    if (!registerAssembly.Contains(assembly.FullName))
                    {
                        GrainInternalEventHandlerProvider.RegisterInternalEventHandler(assembly);
                        EventNameTypeMapping.RegisterEventType(assembly);
                        registerAssembly.Add(assembly.FullName);
                    }
                }
            }
        }