У нас есть сценарии, в которых объектам, которые находятся «глубже» в графе объектов, необходимо обновлять значения в зависимости от значения предка. Например, рассмотрим упражнение по сопоставлению, в котором мы сопоставляем значения объекта, поступающего из веб-представления. У нас есть исходный постоянный объект, как он существует в базе данных / хранилище, и у нас есть мутировавший объект, который поступает из представления. Учитывая приведенную ниже «схему» для визуала, если мы отображаем входящий объект из представления в постоянный «двойник» из базы данных, и мы хотим установить значение франшизы покрытия на основе значения франшизы политики по умолчаниюЕсть ли способ сделать это, не передавая ссылку на родительский объект?
{
Policy: {
DefaultDeducitble: 1000
LocationCollection: [{
Location: {
BuildingCollection: [{
Building: {
CoverageCollection: [{
Coverage: { DefaultDeductible: nulll}
}]
}
}]
}
}]
}
}
Наши преобразователи отображают один уровень иерархии объектов, поэтому у нас будет что-то вроде:
class PolicyMapper { /// maps policy and calls a location collection mapper }
class LocationCollectionMapper { /// calls a location mapper for each location }
class LocationMapper {///maps the location and calls building collection mapper }
class BuildingCollectionMapper { /// calls a building mapper for each building }
class BuidlingMapper {///maps the buidling and calls coverage collection mapper }
class CoverageCollectionMapper { /// calls a coverage mapper for each coverage }
class CoverageMapper {///maps the coverage, this is where we want a value from the Policy level }
Таким образом, вопрос заключается в том, как мы можем получить доступ к информации об уровне политики в CoverageMapper, не передавая объект Policy по всей иерархии сопоставления? Одна идея состояла в том, чтобы иметь временный кэш, который мы можем запросить. Я действительно не знаю, существует ли это ... или это хорошая идея или антипаттерн ... однако это выглядело бы примерно так:
public class TransientPolicyCache {
///code to load the cache and retreive stuff
public Policy Get() { //returns the policy }
}
public class CoverageMapper {
public CovergaeMapper(TransientPolicyCache cache) { ///cache is provided by ioc }
public Coverage Map(Coverage target, Coverage source){
//need the policy
var policy = _cache.Get();
// do the things
}
}