Ответ 1
На самом деле. да.
В вашем конкретном случае обертывание таким образом позволяет быстро начать болтовку по логике, например, сделать ApplicationDbContext и singleton или обработать исключение в общем виде для всего приложения. Поскольку конструктор не может вернуть значение null, это может быть очень важно, чтобы иметь возможность поймать исключение и вернуть значение null.
Tuple.Create является ярким примером общего вывода, который не работает с конструкторами. Это позволяет вам сказать
Tuple.Create(Item1, Item2.. ItemN);
И пусть компилятор выводит типы, а не
new Tuple<T1, T2...Tn>(Item1, Item2...ItemN);
Что более подробно, и требуется немного больше работы, если вы хотите отключить один из этих типов.
Существует также случай Анонимных типов, который не может быть указан явно и, следовательно, не может использоваться в новых операторах. Я специально имел случай, когда при поиске сборок для определенного атрибута для связывания структуры команд я хотел сделать перечислимым (очередь в этом случае) из анонимного типа во время поиска для сопряжения ссылок класса со своим конструктором и строковые аргументы, а не искать их каждый раз, когда они нужны. Поскольку я могу снова использовать общий вывод в методе, мне удалось обернуть конструктор в метод расширения и выполнить задание.
Есть также случаи для одноэлементных паттернов, в которых вы хотите, чтобы метод GetInstance обычно создавал значение или получал его, если он существует. Может не квалифицироваться, так как он немного больше, чем завершает конструктор.
Кроме того, существует множество случаев, когда вы можете контролировать процедуры внедрения, например, принуждать их к другим потокам, регистрировать их в базе данных, которая будет отменена позже, или закрепить систему разрешений, все из которых могут быть сделанный путем создания обертки конструктора и добавления еще нескольких строк логики, а затем приватизации конструктора, чтобы избежать прямого его вызова.
Существуют также случаи, когда я создал метод factory, который делегирует известным детям, чтобы обеспечить другую реализацию возвращенного интерфейса или абстрактного на основе предоставленных параметров. Это имеет дополнительное преимущество, заключающееся в возможности скрыть классы-реализации. В этом классе используется класс Type и IEnumerable.