ответ

2

Там нет никакой разницы: внутренне builder.RegisterModule<XYZDataModule>(); реализуются следующим образом:

public static void RegisterModule<TModule>(this ContainerBuilder builder) 
    where TModule : IModule, new() 
{ 
    Autofac.RegistrationExtensions.RegisterModule(builder, (IModule) new TModule()); 
} 

поэтому общий метод вызова нон дженерика.

Предоставление двух методов для одной и той же вещи в основном для удобства и предпочтений, но это общая практика в .net, чтобы предоставить не общую версию общих методов.

И обычно есть небольшая разница в использовании:

Если вы знаете время типа компиляции модуля и ваш модуль действительно есть Defualt застройщик использовать общий метод (который является менее персонажу типа):

builder.RegisterModule<XYZModule>(); 

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

builder.RegisterModule(new XYZModule()); 

Итак, в качестве общего руководства: используйте общую версию, если вы знаете тип и используете не общую версию, если вы не знаете тип во время компиляции (конечно, вы можете создавать общие методы/классы также во время запуска, время с отражением, но это совсем другая история).

Смежные вопросы