Получение ссылок на объекты данных

Бывает удобно не хранить явно ссылок на объекты данных, а получать эти ссылки по .Net типу и первичному ключу. Бывают также ситуации, когда программист вообще не имеет явных ссылок и не имеет другой возможности их получить, кроме как по .Net типу и первичному ключу.

Такая возможность реализована в CASEBERRY FRAMEWORK, она называется контекстно-зависимым кэшем и поддерживается классом DataObjectCache. Программист может ограничить часть кода, в котором применяется кэширование, методами DataObjectCache.StartCaching, DataObjectCache.StopCaching. Внутри этой части кода можно положить в кэш объект данных (DataObjectCache.AddDataObject) и получить его (DataObjectCache.GetLivingDataObject).

class Class1
	{
		[STAThread)
		static void Main(string[) args)
		{
            var doc = new DataObjectCache();
			doc.StartCaching(false);
			object pkey = prv_CreateDataObject();
			SimpleDataObject sdo = (SimpleDataObject) doc.GetLivingDataObject(typeof(SimpleDataObject), pkey);
			doc.StopCaching();
			Console.WriteLine(String.Format("Getted from cache dataobject name = {0}",sdo.Name));
			Console.Read();
		}
		private static object prv_CreateDataObject()
		{
            var doc = new DataObjectCache();
			SimpleDataObject sdo = new SimpleDataObject();			
			sdo.Name="Объект данных";
			Console.WriteLine(String.Format("Created dataobject name = {0}",sdo.Name));
			doc.AddDataObject(sdo);
			return sdo.__PrimaryKey;
		}
	}

Каждый вызов метода DataObjectCache.StartCaching образует контекст, простирающийся до вызова DataObjectCache.StopCaching. Вызов метода DataObjectCache.StartCaching внутри контекста образует вложенный контекст.

Объекты, добавляемые в контекстах более низкого уровня, автоматически попадают в контексты более высокого.

Доступностью объектов более высокого уровня в контекстах более низкого программист может управлять. Можно «отрезать» вышестоящий контекст. Для этого служит параметр ClipParentCache метода DataObjectCache.StartCaching. Если метод вызван с параметром true, то объекты контекста уровнем выше никогда не доступны создаваемому контексту и всем нижележащим.

Метод DataObjectCache.GetLivingDataObject просматривает только контекст текущего уровня. Метод DataObjectCache.GetExtLivingDataObject просматривает все вышележащие контексты, кроме текущего, но не выше «отрезанного».

Внутри одного метода нельзя делать вложенные контексты, за исключением случая, когда новый контекст «отрезает» вышестоящий.