27 авг. 2008 г.

UnitOfWork & IdentityMap

Решил и я выложить свой взгляд на эти вещи. Много документации было прочитано, много ресурсов было найдено. Прежде всего UnitOfWork понимает с дословного перевода "Единица работы". Т.е. это определенный блок команд/операций которые должны буду выполнены за один цикл. Этот цикл будет рассматриваться как одна операция (транзакция в СУБД).

Теперь собственно код:

///
/// Класс-контейнер UnitOfWork
///

public sealed class UnitOfWork
{
private List _items;

///
/// Конструктор
///

public UnitOfWork() {
log = new CLog();
_items = new List();
}

///
/// Добавляем новый объект в контейнер и помечаем его как новый
///

public void New(DomainObject obj)
{
foreach (DomainObject sobj in _items
.Where(f => f.objectState == ObjectState.NewObject))
{
if (sobj.GUID == obj.GUID)
{
log.Add("Объект уже зарегестрирован как новый => " + obj.GetType().Name.ToString());
return;
}
else
{
obj.objectState = ObjectState.NewObject;
_items.Add(obj);
return;
}
}

obj.objectState = ObjectState.NewObject;
_items.Add(obj);
}

///
/// Добавляем новый объект в контейнер и помечаем его как измененный
///

public void Dirty(DomainObject obj)
{
foreach (DomainObject sobj in _items
.Where(f => f.objectState == ObjectState.DirtyObject))
{
if (sobj.GUID == obj.GUID)
{
log.Add("Объект уже зарегестрирован как измененный => " + obj.GetType().Name.ToString());
return;
}
else
{
obj.objectState = ObjectState.DirtyObject;
_items.Add(obj);
return;
}
}

obj.objectState = ObjectState.DirtyObject;
_items.Add(obj);
}

///
/// Добавляем новый объект в контейнер и помечаем его как удаленный
///

public void Removed(DomainObject obj)
{
foreach (DomainObject sobj in _items.Where(f => f.objectState == ObjectState.DeletedObject))
{
if (sobj.GUID == obj.GUID)
{
log.Add("Объект уже зарегестрирован как удаленный => " + obj.GetType().Name.ToString() + " [" + obj.UID.ToString() + "]");
string o = "Obj => " + obj.GUID.ToString();
string o1 = "Sobj => " + sobj.GUID.ToString();
log.Add(o);
log.Add(o1);
}
else
{
obj.objectState = ObjectState.DeletedObject;
_items.Add(obj);
return;
}
}

//если IM пустая
if (_items.Count == 0)
{
obj.objectState = ObjectState.DeletedObject;
_items.Add(obj);
}
}

public void Clear()
{
_items.Clear();
}

public IList Get()
{
return _items;
}
}