Page 1 of 1

ASP.NET CORE | Registrieren Sie alle Konfigurationen basierend auf einer Markierungsschnittstelle

Posted: 12 Feb 2025, 09:16
by Guest
Ich hatte das Problem, meine Dienste zu registrieren. Ich brauchte einen Mechanismus, den die App automatisch alle meine Dienste basierend auf Marker -Schnittstellen findet und registrieren würde. Also habe ich das geschrieben, was gut funktioniert: < /p>

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  
im Gegensatz zu Service-Registrierungen einen Typ Instanz nicht akzeptiert. -Override ">

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();
Gibt es eine Möglichkeit, meine Konfigurationsdateien automatisch basierend auf einer Markierungsschnittstelle zu registrieren?