Freeze/Inject/Register в AutoFixture



Давным-давно, в первых версиях библиотеки балом правил Register. Два других метода ещё не существовали.



Определён он был следующим образом:



public static void Register<T>(this IFixture fixture, T item)



Однако, была и перегрузка:



public static void Register<T>(this IFixture fixture, Func<T> creator)



Какое-то время казалось, что это нормально, впрочем, вскоре пользователи стали путаться. Например, можно было написать следующий код:



fixture.Register(() => universe.LightUp());



Поскольку делегат может получаться путём приведения ссылкой на метод, то валидной была и следующая запись:



fixture.Register(universe.LightUp);



Что если universe.LightUp это обращение к свойству, а не к методу? Тогда была бы выбрана первая перегрузка.



Но это крайне неочевидно.

Поэтому первая перегрузка превратилась в Inject<T>(this IFixture fixture, T item).



У метода Freeze несколько другая история.

В прошлом оказалось, что достаточно часто встречается следующее использование AutoFixture в императивном стиле:



var foo = fixture.Create<Foo>();

fixture.Inject(foo);



Тогда, автор библиотеки решил, что это так называемая концепция заморозки.

В итоге два вызова превратились в один метод Freeze.