コマンドパターンのやり方はどうですか?完璧なコマンドパターンの実装ではないかもしれませんが、非常に近いものです。以下を参照してください:
public interface ICommand {
ICommandResult Execute();
ICommandResult Rollback();
}
public interface ICommandResult {
bool Success { get; set; }
object Data { get; set; }
Exception Error { get; set; }
}
public class CommandResult : ICommandResult {
public bool Success { get; set; }
public object Data { get; set; }
public Exception Error { get; set; }
}
public class AddToDBCommand : ICommand {
private ICommandResult result;
private int newRecordId;
public AddToDBCommand(<params_if_any>) {
result = new CommandResult();
}
public ICommandResult Execute() {
try {
// insert record into db
result.Success = true;
result.Data = 10; // new record id
}
catch (Exception ex) {
result.Success = false;
result.Error = ex;
}
return result;
}
public ICommandResult Rollback() {
try {
// delete record inserted by this command instance
// use ICommandResult.Data to get the 'record id' for deletion
Console.WriteLine("Rolling back insertion of record id: " + result.Data);
// set Success
}
catch(Exception ex) {
// set Success and Error
// I'm not sure what you want to do in such case
}
return result;
}
}
同様に、クラウドリソースを作成してdb内のレコードを更新するためのコマンドを作成します。メインコードでは、ICommandオブジェクトのコレクションを保持し、それぞれを実行できます。それが収集し、各コマンドにRollback
を呼び出しながら後方ループで現在のコマンドインデックスを記録し、その後Success = false
を返す場合
var commands = new List<ICommand>
{
new AddToDBCommand(<params_if_any>),
new AddToCloudCommand(<params_if_any>),
new UpdateInDBCommand(<param_if_any>)
};
は、その後のループで、あなたは、Execute
を呼び出すことができます。
DBの両方がシングルDBで動作し、同じ接続で動作していますか? – Amit