Ответ 1
Для этого вы можете использовать закрытый статический кеш. Это немного больше работы по настройке, но не требует дополнительных классов или общедоступных изменений в вашей модели домена. Большой недостаток заключается в том, что записи не удаляются из кеша, но вы можете использовать пользовательскую коллекцию или "глобальный" кеш, ограничивающий количество записей.
public class Entity
{
public virtual int Id { get; protected set; }
}
public class PcmAudioStream
{}
public class User : Entity
{
private static readonly IDictionary<int, PcmAudioStream> _fullNameRecordingCache;
private PcmAudioStream _fullNameRecording;
static User()
{
_fullNameRecordingCache = new Dictionary<int, PcmAudioStream>();
}
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual PcmAudioStream FullNameRecording
{
get
{
if (_fullNameRecordingCache.ContainsKey(Id))
{
return _fullNameRecordingCache[Id];
}
// May need to watch for proxies here
_fullNameRecordingCache.Add(Id, _fullNameRecording);
return _fullNameRecording;
}
set
{
if (_fullNameRecordingCache.ContainsKey(Id))
{
_fullNameRecordingCache[Id] = value;
}
_fullNameRecording = value;
}
}
// ...
}
Mapping:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.Id);
Map(x => x.FirstName);
Map(x => x.LastName);
Map(x => x.FullNameRecording).CustomType<PcmAudioStreamAsByteArray>()
.Access.CamelCaseField(Prefix.Underscore);
}
}
Отредактировано в ответ на комментарии:
Я не вижу, что это можно достичь в пользовательском типе, потому что IDataReader уже открыт в NullSafeGet. Я думаю, вы могли бы сделать это в слушателе, реализующем IPreLoadEventListener, но это не позволяет вам аннулировать кеш. Я не думаю, что любой вариант жизнеспособен.
Подумав об этом еще, я все еще думаю, что мое исходное решение (или вариант) - лучший вариант. Я понимаю (и разделяю) ваше стремление к чистой модели домена, но иногда требуются компромиссы, и мое решение не изменяет публичных членов модели или не требует каких-либо дополнительных ссылок. Другим оправданием является то, что объект первым узнал, что запись изменилась и нуждается в замене или добавлении в кеш.