< Summary

Information
Class: Amusoft.Toolkit.Mvvm.Core.NavigationModel
Assembly: Amusoft.Toolkit.Mvvm.Core
File(s): /home/runner/work/Amusoft.Toolkit.Mvvm/Amusoft.Toolkit.Mvvm/src/Amusoft.Toolkit.Mvvm.Core/Navigation/NavigationModel.cs
Tag: 8_14199367891
Line coverage
0%
Covered lines: 0
Uncovered lines: 4
Coverable lines: 4
Total lines: 56
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
get_ModelType()100%210%

File(s)

/home/runner/work/Amusoft.Toolkit.Mvvm/Amusoft.Toolkit.Mvvm/src/Amusoft.Toolkit.Mvvm.Core/Navigation/NavigationModel.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Diagnostics.CodeAnalysis;
 4using System.Linq;
 5
 6namespace Amusoft.Toolkit.Mvvm.Core;
 7
 8internal abstract class NavigationModel
 9{
 010  public NavigationModel(Type modelType)
 11  {
 012    ModelType = modelType;
 013  }
 14
 015  public Type ModelType { get; set; }
 16
 17  public abstract bool TryGetModelInstance([NotNullWhen(true)] out object? model);
 18}
 19
 20internal class NavigationModel<T> : NavigationModel where T : class
 21{
 22  private readonly IRestoreStrategy<T>[] _restoreStrategies;
 23
 24  public NavigationModel(T model, IRestoreStrategy<T>[] restoreStrategies) : base(model.GetType())
 25  {
 26    _restoreStrategies = restoreStrategies;
 27    _modelReference = new WeakReference<T>(model);
 28    foreach (var restoreStrategy in restoreStrategies)
 29    {
 30      restoreStrategy.CollectRestoreInformation(model);
 31    }
 32  }
 33
 34  private WeakReference<T> _modelReference;
 35
 36  public override bool TryGetModelInstance([NotNullWhen(true)] out object? model)
 37  {
 38    model = null;
 39    if (_modelReference.TryGetTarget(out var typedModel))
 40    {
 41      model = typedModel;
 42      return true;
 43    }
 44
 45    var restoredModel = _restoreStrategies.OrderByDescending(d => d.Priority)
 46      .FirstOrDefault()?
 47      .Recreate();
 48
 49    if (restoredModel == null)
 50      return false;
 51
 52    _modelReference = new WeakReference<T>(restoredModel);
 53    model = restoredModel;
 54    return true;
 55  }
 56}

Methods/Properties

.ctor(System.Type)
get_ModelType()