Я просто хотел опубликовать решение, которое придумал, однако я верю, что есть много способов снять шкуру с этой кошки.
Вот мой FetchDepthCounterClass, который я создал:
public static class FetchDepthCounter
{
private static Dictionary<Type, int> _DepthCounter;
private static int _MaxDepth = 3;
static FetchDepthCounter()
{
_DepthCounter = new Dictionary<Type, int>();
}
public static void SetDepth(int depth)
{
_MaxDepth = depth;
}
public static void ResetCounter()
{
_DepthCounter.Clear();
}
public static bool IncrementCounter(Type entityType)
{
if(!_DepthCounter.ContainsKey(entityType))
{
_DepthCounter.Add(entityType, 0);
return true;
}
if(_DepthCounter[entityType] < _MaxDepth)
{
++_DepthCounter[entityType];
return true;
}
return false;
}
}
IncrementCounter возвращает логическое значение, указывающее, достигнута ли максимальная глубина выборки или нет. Я вызываю инкрементный счетчик как часть моего процесса отображения прямо перед тем, как установить значение свойства. Сначала я определяю, что мне нужно загрузить другой объект DTO или коллекцию DTO, и я передаю тип parent и приращение для этого типа. Вот небольшой кусочек кода внутри моего метода SetValue в моем datamapper:
if(isDto)
{
if (!FetchDepthCounter.IncrementCounter(property.ComponentType))
return;
}
Вот так, кажется, это и делает. Все мои юнит-тесты проходят. Спасибо всем за помощь. Я надеюсь, что это поможет кому-то позже. Еще раз, это, вероятно, было бы намного проще обернуть его в единицу рабочего шаблона, и в конце концов я могу это сделать, но на данный момент работа выполнена.