Маленький пример на тему того, как не меняя программный код можно управлять способом работы с базой данных чертежа: с использованием транзакции, или же с её эмуляцией. Используя такой подход можно моментально поменять способ работы сразу во многих местах, не внося правки в исходный код.
// © Андрей Бушман, 2014
// Commands.cs
// AutoCAD 2009 SP3
// Код предназначен для демонстрации того, как можно, не внося изменений в
// исходный код, менять способ работы с базой данных чертежа: с использованием
// транзакции или же с её эмуляцией.
using System;
#if AUTOCAD
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gm = Autodesk.AutoCAD.Geometry;
using Rt = Autodesk.AutoCAD.Runtime;
#endif
[assembly: Rt.CommandClass(typeof(Bushman.CAD.Sandbox.TransactionGames.Commands
))]
namespace Bushman.CAD.Sandbox.TransactionGames {
public sealed class Commands {
/// <summary>
/// Тестовая команда
/// </summary>
[Rt.CommandMethod("SwitchTransactionSample")]
public void SwitchTransactionSample() {
Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
if (null == doc)
return;
Db.Database db = doc.Database;
Db.TransactionManager tm = db.TransactionManager;
Ed.Editor ed = doc.Editor;
Ed.PromptKeywordOptions pso = new Ed.PromptKeywordOptions(
"Использовать транзакцию?");
String yes = "Yes";
String no = "No";
pso.Keywords.Add(yes);
pso.Keywords.Add(no);
pso.AppendKeywordsToMessage = true;
pso.Keywords.Default = yes;
Ed.PromptResult pr = ed.GetKeywords(pso);
ed.WriteMessage("Вы выбрали: {0}n", pr.StringResult);
if (Ed.PromptStatus.OK != pr.Status) {
ed.WriteMessage("Выполнение команды прервано.n");
}
Boolean transaction_use = pr.StringResult == yes;
// Т.к. OpenCloseTransaction наследуется от Transaction, то
// получить Transaction можно следующим образом:
using (Db.Transaction tr = GetTransaction(tm, transaction_use)) {
Db.DBText text = new Db.DBText();
text.SetDatabaseDefaults(db);
text.Height = 30;
Double y = 100;
String text_string = String.Empty;
if (transaction_use) {
text_string = "Текст создан с использованием транзакции.";
}
else {
y = 200;
text_string = "Текст создан с эмуляцией транзакции.";
}
text.Position = new Gm.Point3d(100, y, 0);
text.TextString = text_string;
Db.BlockTableRecord model_space = tr.GetObject(
db.CurrentSpaceId, Db.OpenMode.ForWrite)
as Db.BlockTableRecord;
model_space.AppendEntity(text);
tr.AddNewlyCreatedDBObject(text, true);
tr.Commit();
}
}
/// <summary>
/// Данный метод позволяет выбрать способ работы с базой данных
/// чертежа: с использованием транзакции или же с её эмуляцией.
/// </summary>
/// <param name="tm">Менеджер транзакций</param>
/// <param name="emulate"><c>true</c> - использовать транзакцию;
/// <c>false</c> - эмулировать транзакцию.
/// </param>
/// <returns>Возвращается объект <c>Transaction</c> (
/// <c>OpenCloseTransaction</c> унаследован от этого класса).</returns>
Db.Transaction GetTransaction(Db.TransactionManager tm,
Boolean transaction_use) {
Db.Transaction tr = transaction_use ? tm.StartTransaction() :
tm.StartOpenCloseTransaction();
return tr;
}
}
}