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

Ein Treffpunkt für C#-Programmierer
Guest
 ASP.NET CORE | Registrieren Sie alle Konfigurationen basierend auf einer Markierungsschnittstelle

Post 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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post