c# – 如何确保系统级操作是原子的?任何模式?
发布时间:2020-12-15 08:17:56 所属栏目:百科 来源:网络整理
导读:我有一个方法,它按顺序在内部执行不同的子操作,并且在我想要回滚整个操作的任何子操作失败时. 我的问题是子操作不是所有的数据库操作.这些主要是系统级更改,例如在Windows注册表中添加内容,在指定路径创建文件夹以及设置权限等.子操作可能不止于此. 想要做这
我有一个方法,它按顺序在内部执行不同的子操作,并且在我想要回滚整个操作的任何子操作失败时.
我的问题是子操作不是所有的数据库操作.这些主要是系统级更改,例如在Windows注册表中添加内容,在指定路径创建文件夹以及设置权限等.子操作可能不止于此. 想要做这样的事情; CreateUser(){ CreateUserFtpAccount(); CreateUserFolder(); SetUserPermission(); CreateVirtualDirectoryForUser(); .... .... .... and many more } 如果上次操作失败,我想回滚所有以前的操作. 那么,这样做的标准方法是什么?是否有设计模式可以处理这个? 注意:我正在使用C#.net 解决方法
这是一种方法:
使用command pattern,您可以创建可撤消的操作.每次操作都会注册相关命令,以便在发生故障时撤消执行的命令. 例如,这可能都属于类似事务的上下文对象,该对象实现IDisposable并放入using块.可撤消的操作将注册到此上下文对象.在处置时,如果未提交,则对所有已注册的命令执行“撤消”.希望能帮助到你.缺点是您可能需要将某些方法转换为类.这可能是一个必要的邪恶. 代码示例: using(var txn = new MyTransaction()) { txn.RegisterCommand(new CreateUserFtpAccountCommand()); txn.RegisterCommand(new CreateUserFolderCommand()); txn.RegisterCommand(new SetUserPermissionCommand()); txn.RegisterCommand(new CreateVirtualDirectoryForUserCommand()); txn.Commit(); } class MyTransaction : IDisposable { public void RegisterCommand(Command command){ /**/ } public void Commit(){ /* Runs all registered commands */ } public void Dispose(){ /* Executes undo for all registered commands */ } } class UndoableCommand { public Command(Action action) { /**/ } public void Execute() { /**/ } public void Undo{ /**/ } } 更新: 你提到你有数百个这样的可逆操作.在这种情况下,您可以采用更实用的方法并完全摆脱UndoableCommand.您可以改为注册代表,如下所示: using(var txn = new MyTransaction()) { txn.Register(() => ftpManager.CreateUserAccount(user),() => ftpManager.DeleteUserAccount(user)); txn.Register(() => ftpManager.CreateUserFolder(user,folder),() => ftpManager.DeleteUserFolder(user,folder)); /* ... */ txn.Commit(); } class MyTransaction : IDisposable { public void Register(Action operation,Action undoOperation){ /**/ } public void Commit(){ /* Runs all registered operations */ } public void Dispose(){ /* Executes undo for all registered and attempted operations */ } } 需要注意的是,使用这种方法时需要注意closures. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |