Сейчас, при определении того, какое значение из запроса в какой параметр будет отправлено, мы основываемся на их позиция. Так, если у нас есть условный конструктор с двумя параметрами с типом int и есть две значения в запросе, то первое уйдёт в первые параметр а второе – во второй.
Пока это нас вполне устраивает. Но мы не имеем возможности при вводе значения в консоли (или через любой другой ввод) указать то, что первое число должно уходить во второй параметр, а второй – в первый.
Это можно было бы достичь с помощью меток. Например, для выполнения команды BuyGood, можно было бы записывать такую строку:
BuyGood goodId:1 count:2
Вместо :
BuyGood 1 2
Чтобы сохранить поддержку ввода старого образца, мы могли бы сделать ещё одну сущность, которая преобразовывала бы обычный позиционный ввод в именованные аргументы, которые мы могли бы в дальнейшем более точно ассоциировать с параметрами.
В классе Request появился бы примерно такой метод.
Фрагмент 2.41
public bool TryGetValue(string name, out int value)
{
}
И мы бы им пользовались в классе Router в методе определения аргументов.
Фрагмент 2.42
private object[] ResolveDependeciesAndMerge(ConstructorInfo constructor, Request request)
{
List<object> args = new List<object>();
foreach (var parameter in constructor.GetParameters())
{
if (_dependecies.TryGetValue(parameter.ParameterType, out object value))
{
args.Add(value);
}
else
{
if (request.TryGetValue(parameter.Name, out int arg))
{
args.Add(arg);
}
else
{
return null;
}
}
}
if (args.Count == constructor.GetParameters().Length)
{
return args.ToArray();
}
else
{
return null;
}
}