命令模式-工作单元

作者: Carson_jz | 来源:发表于2019-11-05 21:51 被阅读0次

摘要:工作单元是命令模式得一种具体应用,就以webapi操作数据库来说工作单元模式,一次请求,需要操作多个或多次操作数据库,如果每操作一次都直接提交给数据库,那有可能在某些瞬态错误导致没法完成所有操作而产生数据不一致,不考虑分布式事务,最好得做法就是把所有操作打包,最后一次性把操作提交给数据库,这样可以最大程度保证一致性。设计模式Github源码

拿数据库操作来描述一个工作单元

Repository(仓储类):这是用来写操作命令的库

UnitOfWork(工作单元类):里边有一个委托List 用来存储仓储类的命令,凡是你在程序里调用的Repository的方法都会存储在此,这个类还有一个执行方法Save,就是最终一起执行所有仓储命令

工作单元除了有以上有点,还有其他方面的优点,例如:

你在 UnitOfWork Save()方法里可以完成在你提交redis之前,提交redis之后执行相关逻辑,这也是aop的一种接入方式,分离了操作命令与数据持久化。

代码实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace UnitOfWork
{
    public class Model
    {
        public static Model CreateNew(string myKey)
        {
            return new Model()
            {
                Key = myKey
            };
        }
        public string Key { get; set; }
    }
    public class Repository
    {
        public string Add(Model model)
        {
            Console.WriteLine(model.Key);
            return "add command";
        }

        public string Update(Model model)
        {
            Console.WriteLine(model.Key);
            return "update command";
        }

        public string Delete(Model model)
        {
            Console.WriteLine(model.Key);
            return "delete command";
        }
    }

    public class UnitOfWork
    {
        public List<Func<string, string>> Commands { get; set; } = new List<Func<string, string>>();

        public void AddCommand(Func<string, string> repositoryFunc)
        {
            Commands.Add(repositoryFunc);
        }

        public void Save()
        {
            var publicKey = "PublicKey-";
            //执行委托集合命令
            var commandList = Commands.Select(c => c(publicKey)).ToList();

            //打包命令然后提交
            //code...
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            UnitOfWork uow = new UnitOfWork();

            Repository repository = new Repository();

            uow.AddCommand((publicKey) =>
            {
                var model = Model.CreateNew(publicKey + "AddKey");
                return repository.Add(model);
            });
            uow.AddCommand((publicKey) =>
            {
                var model = Model.CreateNew(publicKey + "UpdateKey");
                return repository.Update(model);
            });
            uow.AddCommand((publicKey) =>
            {
                var model = Model.CreateNew(publicKey + "DeleteKey");
                return repository.Delete(model);
            });

            Console.WriteLine("Hello World!");

            //到这里才把所有语句执行
            uow.Save();

            Console.ReadKey();
        }
    }
}

相关文章

  • 命令模式-工作单元

    摘要:工作单元的 “工作” 我们可以理解同一业务下的所有对外部存储数据的操作,比如数据持久化到磁盘,提交redis...

  • Jupyter常用快捷键

    命令模式 Enter : 进入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter...

  • 三、Jupyter快捷键

    一、编辑模式 绿色框,编辑内部内容 切换 运行(命令模式也可用) 提示和操作 二、命令模式 切换 整体操作 单元操...

  • 1.3-Jupyter notebook使用

    常用快捷键:命令模式(按Esc键):Enter:转入编辑模式Shift-Enter:运行本单元,选中下个单元Ctr...

  • jupyter notebook快捷键

    在编辑模式和命令模式间相互切换 在编辑模式中你可以键入单元格,在命令模式你可以敲击键盘来执行命令,例如创建一个新的...

  • Jupyter Notebook 的快捷键

    命令模式 (按键 Esc 开启) 键盘输入运行程序命令;这时的单元框线是灰色。 Enter : 转入编辑模式Shi...

  • Jupyter Notebook快捷键

    Jupyter Notebook 有两种键盘输入模式: 命令模式,键盘输入运行程序命令;这时的单元框线是灰色。 编...

  • jupyter notebook札記

    命令模式 (按键 Esc 开启) Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单...

  • jupyter 使用技巧及python常用知识

    快捷键: 命令模式 (按键 Esc 开启) Enter: 转入编辑模式 Shift-Enter: 运行本单元,选中...

  • vi学习笔记

    1 工作模式 vi有两种工作模式 命令模式(按ESC进入),这也是vi的默认工作模式 插入模式(按i进入) 在命令...

网友评论

    本文标题:命令模式-工作单元

    本文链接:https://www.haomeiwen.com/subject/spzebctx.html