O agrupamento de dependências relacionadas em métodos de extensão personalizados é uma maneira muito comum de fazer isso. O ASP.NET Core já faz isso para muitos serviços internos, e você pode facilmente expandir além disso e configurá-los da maneira que você precisa para seu aplicativo. Por exemplo, para configurar autenticação e autorização:
public IServiceCollection AddSecurity(this IServiceCollection services)
{
services.AddAuthentication()
.AddCookie();
service.AddAuthorization(options =>
{
options.DefaultPolicy = …;
});
return services;
}
Você pode fazer o mesmo pelos serviços específicos do aplicativo e agrupá-los logicamente em métodos de extensão separados.
Se você tiver muitos registros de serviços muito semelhantes, também poderá empregar um registro baseado em convenções, por exemplo, usando o Scrutor . Por exemplo, isso registra todos os serviços em um determinado espaço de nome como transitório para sua respectiva interface:
services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses(c => c.InNamespaces("MyApp.Services"))
.AsImplementedInterfaces()
.WithTransientLifetime()
);
O Scrutor permite que regras muito complexas varram serviços, portanto, se seus serviços seguirem algum padrão, você provavelmente poderá criar uma regra para isso.