Пример #1
0
        private void PostBoot()
        {
            _ApplyPatches = StateTreeAction.CreateActionInvoker <IJsonPatch[]>
                            (
                StoredValue, "@APPLY_PATCHES",

                (IJsonPatch[] patches) =>
            {
                foreach (var patch in patches)
                {
                    var paths = patch.Path.SplitJsonPath();
                    var node  = this.ResolveNodeByPaths(paths.Take(paths.Length - 1));
                    (node as ObjectNode).ApplyPatchLocally(paths[paths.Length - 1], patch);
                }
            }
                            );

            _ApplySnapshot = StateTreeAction.CreateActionInvoker <object>
                             (
                StoredValue, "@APPLY_SNAPSHOT",

                (object snapshot) =>
            {
                // if the snapshot is the same as the current one, avoid performing a reconcile
                if (snapshot != Snapshot)
                {
                    // apply it by calling the type logic
                    Type.ApplySnapshot(this, snapshot);
                }
            }
                             );
        }
        protected void FinalizeNewInstance(INode node, IMap <string, INode> childNodes)
        {
            var instance = node.StoredValue as IObservableObject <T, INode>;

            // Node = node as ObjectNode;

            if (instance != null)
            {
                foreach (var property in childNodes)
                {
                    instance.Write(property.Key, property.Value);
                }

                foreach (var initializer in Initializers)
                {
                    initializer(instance);
                }

                if (instance is IObservableObject <T, INode> observable)
                {
                    foreach (var action in Actions)
                    {
                        observable.AddAction(action.Name, StateTreeAction.CreateActionInvoker(instance, action.Name, action.Action));
                    }

                    foreach (var hook in Hooks)
                    {
                        var hookAction = (Action <object[]>)Delegate.Combine(hook.Value.ToArray());

                        observable.AddAction(hook.Key.ToString(), Observable.Actions.CreateAction(hook.Key.ToString(), (arguments) =>
                        {
                            hookAction(new object[] { instance }.Concat(arguments).ToArray());
                            return(null);
                        }));
                    }

                    //Actions.RunInAction(call.Name, action, new object[] { call.Target }.Concat(call.Arguments).ToArray())
                }

                instance.Intercept(change => WillChange(change));

                instance.Observe(change => DidChange(change));
            }
        }