В этом нет ничего волшебного. Вы указываете конкретные типы, поэтому, естественно, они разрешимы, потому что если у нас есть объект Type
, мы можем вызвать конструктор.
class Fred { };
Fred f1 = new Fred();
Type t = typeof(Fred);
Fred f2 = (Fred)t.GetConstructor(Type.EmptyTypes).Invoke(null);
Последняя строка выше - это то, что происходит, тип t был найден с помощью typeof
в параметре типа, который вы задаете для Resolve
.
Если тип не может быть создан новым (потому что он находится в некоторой неизвестной отдельной кодовой базе), вы не сможете передать его в качестве параметра типа для Resolve
.
Во втором случае это инжекция конструктора, но это все еще известный конкретный конструируемый тип. С помощью отражения инфраструктура Unity может получить массив всех типов параметров для конструктора. Тип TestWhatever
является конструируемым, поэтому нет никакой двусмысленности или сложности в отношении того, что конструировать.
Что касается вашего беспокойства по поводу отдельных модулей (сборок), если вы переместите TestWhatever
в другую сборку, это не изменит строки написанного вами кода; это просто будет означать, что вам нужно добавить ссылку на другую сборку, чтобы получить эту сборку. И тогда TestWhatever
по-прежнему является однозначно ссылочным конструируемым типом, поэтому он может быть создан Unity.
Другими словами, если вы можете ссылаться на тип в коде, вы можете получить объект Type
, и поэтому во время выполнения он будет непосредственно конструируемым.
Ответ на комментарий:
Если вы удалите класс TestWhatever
, вы получите ошибку во время компиляции, потому что вы ссылаетесь на этот тип в своем коде. Таким образом, невозможно получить время выполнения, выполнив это.
Разъединение все еще действует в этой схеме, поскольку вы можете зарегистрировать конкретный экземпляр TestWhatever
, поэтому каждый вызов Resolve<TestWhatever>()
будет получать один и тот же экземпляр, а не создавать новый.