из серии про грабли, по которым мы ходили, а вам не советуем.
предположим, есть приблизительно следующий код:
public abstract class Entity : EditableObject
{
public abstract int Id { get; set; }
public abstract Category Category { get; set; }
}
public abstract class Category : EditableObject
{
public abstract int Id { get; set; }
public abstract string Name { get; set; }
}
public abstarct class CategoryAccessor : DataAccesor<Category, CategoryAccessor>
{
[Cache]
public abstract List<Category> SelectAll();
}
public abstract class EntityAccessor : DataAccesor<Entity, EntityAccessor>
{
public List<Entity> SelectAll(DbManager db)
{
List<Entity> entities = SelectAllInternal(db);
List<Category> categories = CategoryAccessor.CreateInstance(db).SelectAll();
MapLists(entities, categories);
return entities;
}
}
так вот, такой код приведет к утечке памяти.
дело в том, что Entity подписывается на события PropertyChanged от поля Category. через это дело, экземпляры Category неявно получают ссылки на экземпляры Entity. далее, т.к. экземпляры entity, полученные методом CategoryAccessor.SelectAll() закешированы, то они сидят в статике и становятся корнями (через неявную ссылку по обработчику события) для ссылающихся на них экземпляров Entity, таким образом, GC свято верит, что экземпляры Entity никак нельзя считать мусором. все падает в Gen 2 где благополучно и оседает до моента сброса кеша.
что делать? — убрать ключевое слово
abstract от объявления Entity.Category