Helper Abstract Classes in ImageGear.Web.Services Assembly
To assist in handling annotation transactions, the ImageGear.Web.Services assembly provides two abstract classes that must be implemented in your custom image data provider. Your custom image data provider must include derived classes from these two abstract classes regardless of whether your storage implementation is transactional or non-transactional.
- ImageGear.Web.DataProviders.ArtDataConnection Abstract Class: An abstract base class that represents a connection to the annotation data stream. Your custom provider must derive a class from this abstract class, and may use it to read and write any number of streams.
If your custom provider is based on a non-transactional system then you should implement the
System.Transactions.IEnlistmentNotification interface in your derived class. The Commit method is called when the annotation data needs to be committed to your chosen storage system. The Rollback method is called when there is some kind of failure indicating the final write operation of the annotation data to the storage system must not occur.
- ImageGear.Web.DataProviders.ArtDocumentDataConnection Abstract Class: An abstract base class that represents a connection to the pages of annotations associated with one specific document. Your custom provider must derive a class from this abstract class and customize it as needed.
The example below shows a code sample high-level view and the relationships between the provider code, TransactionScope, and the server API code during an annotations data save operation in the ImageGear.Web assembly API.
C# |
Copy Code |
//The ImageGearAPI calls OpenArtDocument of ImageDataProvider to get an
//ArtDataConnection derived object.For SQL based provider,
//it is recommended that you open a database connection in the
//constructer of the ArtDataConnection derived class.
ImageGear.Web.DataProviders.ArtDataConnection artconnect =
ImageGear.Web.DataProviders.ImageDataProvider.OpenArtData();
//The ImageGearAPI calls the ImageDataProvider ArtDataConnection.Open to open
//the required document
using (ImageGear.Web.DataProviders.ArtDocumentDataConnection document = artconnect.OpenDocument(documentIdentifier))
{
//Since the ImageGearAPI needs to save the annotations data, it needs
//to get a current copy from the repository to do the merge with what
// has just been updated. After that it needs to update the repository.
// This operation requires use of a TransactionScope to make sure this
// data is not updated by another user when this process is taking place.
using (TransactionScope Scope = new TransactionScope())
{
//The ImageGear API reads the document first by calling the
// provider ArtDocumentDataConnection.Read()
System.IO.Stream stream = document.Read();
// The ImageGear API does the merge operations
// System.IO.Stream artStream = ....;
//The data is merged and now the data is written to the
//repository by calling the provider
//artDocumentdataConnection.Write
document.Write(artStream);
//This call will cause the data to be finally committed.
//If you are using non-transactional system for data storage
//then you must implement the IEnlistmentNotification interface.
//The system will call Commit member of this interface to store
//the data. If there is a processing error before this point then
//this interface’Rollback method will be called in which case
//annotation data can not be saved. It is not necessary to
//implement this interface when using transactional repository
//systems like the transactional databases.
Scope.Complete();
}
}
// The Server API disposes the ArtDocumentDataConnection derived and
// ArtDataConnection derived Objects. The SQL connections should be
// disconnected at this point.
artconnect.Dispose(); |