Code: Select all
public interface IService { }
public interface ISingletonService : IService { }
public interface IScopedService : IService { }
public interface ITransientService : IService { }
...
public static IEnumerable TapWhere(
this IEnumerable source,
Func predicate,
Action action)
{
foreach (var item in source)
{
if (predicate(item))
{
action(item);
}
yield return item;
}
}
...
public static WebApplicationBuilder AddApplicationServices(this WebApplicationBuilder builder)
{
var firstLevelAssemblies = Assembly.GetEntryAssembly()!
.GetReferencedAssemblies()
.Select(Assembly.Load);
var secondLevelAssemblies = firstLevelAssemblies
.SelectMany(x => x.GetReferencedAssemblies())
.Select(Assembly.Load);
_ = firstLevelAssemblies.Concat(secondLevelAssemblies)
.DistinctBy(x => x.FullName)
.SelectMany(x => x.GetTypes())
.TapWhere(
typeof(ISingletonService).IsAssignableFrom,
x => builder.Services.AddSingleton(x))
.TapWhere(
typeof(IScopedService).IsAssignableFrom,
x => builder.Services.AddScoped(x))
.TapWhere(
typeof(ITransientService).IsAssignableFrom,
x => builder.Services.AddTransient(x))
.ToArray();
return builder;
}
< /code>
Ich wollte dasselbe mit meinen Konfigurationsdateien tun. Aber ich bin stecken geblieben, weil die Methode für Serviceregistrierungen
Code: Select all
public interface IConfig { }
...
_ = firstLevelAssemblies.Concat(secondLevelAssemblies)
.DistinctBy(x => x.FullName)
.SelectMany(x => x.GetTypes())
.TapWhere(
typeof(IConfig).IsAssignableFrom,
x => builder.Services.Configure()) // :(
.ToArray();