private void Initialisieren(Domänenevent e)
        {
            DataRow r;

            switch (e.Name)
            {
                case "NeuerKontakt":
                    var i = int.Parse(e.Payload["RowIndex"]);
                    r = _tb.Rows.Add(new object[_tb.Columns.Count]);
                    foreach (var p in e.Payload)
                        if (_tb.Columns.Contains(p.Key))
                            r[p.Key] = p.Value;
                    r["Id"] = e.Entitätsid;
                    break;

                case "KontaktVerändert":
                    r = _tb.Rows.Cast<object>().Cast<DataRow>()
                                .First(_ => _["Id", DataRowVersion.Original].ToString() == e.Entitätsid);
                    foreach (var p in e.Payload)
                        r[p.Key] = p.Value;
                    break;
                case "KontaktGelöscht":
                    r = _tb.Rows.Cast<object>().Cast<DataRow>()
                                .First(_ => _["Id", DataRowVersion.Original].ToString() == e.Entitätsid);
                    r.Delete();
                    break;
            }

            _tb.AcceptChanges();
        }
        public IEnumerable<Domänenevent> Ausführen(IEnumerable<Domänenkommando> kommandos)
        {
            return kommandos.Select((cmd, i) => {
                var e = new Domänenevent();
                switch (cmd.Name)
                {
                    case "KontaktAnlegen":
                        e.Name = "NeuerKontakt";
                        e.Entitätsid = Guid.NewGuid().ToString();
                        e.Payload = cmd.Payload;
                        e.Payload.Add("RowIndex", i.ToString());
                        break;

                    case "KontaktAktualisieren":
                        e.Name = "KontaktVerändert";
                        e.Entitätsid = cmd.Entitätsid;
                        e.Payload = cmd.Payload;
                        break;

                    case "KontaktLöschen":
                        e.Name = "KontaktGelöscht";
                        e.Entitätsid = cmd.Entitätsid;
                        break;
                }
                return e;
            });
        }
        public static Domänenevent Parse(string eventText)
        {
            var sr = new StringReader(eventText);
            var e = new Domänenevent {
                Name = sr.ReadLine(),
                Laufende_Nummer = int.Parse(sr.ReadLine()),
                Entitätsid = sr.ReadLine()
            };
            do
            {
                var l = sr.ReadLine();
                if (string.IsNullOrEmpty(l)) break;

                var kv = l.Split('\t');
                e.Payload.Add(kv[0], kv[1]);
            } while (true);
            return e;
        }
        public void Nachführen(Domänenevent e)
        {
            DataRow r;

            switch (e.Name)
            {
                case "NeuerKontakt":
                    var i = int.Parse(e.Payload["RowIndex"]);
                    r = _tb.Rows[int.Parse(e.Payload["RowIndex"])];
                    r["Id"] = e.Entitätsid;
                    r.AcceptChanges();
                    break;

                case "KontaktVerändert":
                case "KontaktGelöscht":
                    r = _tb.Rows.Cast<object>().Cast<DataRow>()
                                .First(_ => _["Id", DataRowVersion.Original].ToString() == e.Entitätsid);
                    r.AcceptChanges();
                    break;
            }
        }