Пример #1
0
        async Task Upgrade()
        {
            var versionFile = await Store.Info(VersionFile);

            var md = versionFile == null ? new StoreMd {
                Version = new SemVersion(0)
            } : await Store.Get <StoreMd>(VersionFile);

            var upgradeMethods = GetType().GetMethods()
                                 .Select(m => (m, a: m.GetCustomAttribute <UpgradeAttribute>())).Where(m => m.a != null)
                                 .Select(m => (m.m.Name, Upgrade: new Func <Task>(async() => {
                Log.Information("Upgrade {Name} - started", m.m.Name);
                var sw = Stopwatch.StartNew();
                await(Task) m.m.Invoke(this, new object[] { });
                Log.Information("Upgrade {Name} - completed in {Duration}", m.m.Name, sw.Elapsed.HumanizeShort());
            }), Version: SemVersion.Parse(m.a.Version)));

            var toRun = upgradeMethods
                        .Where(m => m.Version > md.Version || m.Version == md.Version && !md.Ran.Contains(m.Name))
                        .OrderBy(m => m.Version).ToArray();

            foreach (var run in toRun)
            {
                await run.Upgrade();

                md.Ran.Add(run.Name);
                md.Version = run.Version;
                await Save(md);
            }
        }