Scrutor czyli skanowanie Assembly dla domyślnego DI ASP.NET Core

Jakiś czas temu podczas rozwijania swojego projektu Open Source stanąłem przed, wydawać by się mogło prostym problemem. Otóż chciałem udostepnić użytkownikom biblioteki metodę rozszerzającą, która automatycznie zarejestrowałaby w kontenarze dependency injection wszystkie klasy implementujace konkretny interfejs. W przypadku zewnętrzynych bibliotek jak np. Autofac taki zabieg jest możliwy dzieki Assebly Scaning, który wyglada następująco:

 


builder.RegisterAssemblyTypes(myAssembly)
    .Where(t => t.IsAssignableTo<IMyInterface>())
    .AsImplementedInterfaces();

 

Problem polegał na tym, że w moim przypadku nie mogłem posłużyć się np. Autofac, ponieważ musiałem założyc, że osoba która użyje mojej biblioteki w swoim projekcie może używać domyślengo kontenera DI dostarczonego przez ASP.NET Core. W takim przypadku instalowanie pośrednie Autofaca byłoby procesem mało pożądanym i mogłoby odstraszyć potencjalnych użytkowników. Potrzebowałem zatem mechanizmu skanowanie konkretnego Assembly, który byłby wspierany przez DI ASP.NET Core. Tak trafiłem na projekt Scrutor. Jak podaje opis:
 

Assembly scanning and decoration extensions for Microsoft.Extensions.DependencyInjection

 
Idealnie. Po zainstalowaniu NuGet-a w swoim projekcie mogłem dokończyć swoje zadanie:

 

private static void RegisterComponents(this IServiceCollection services)
    => services.Scan(scan =>
    {
        var assembly = Assembly.GetEntryAssembly();

        scan
            .FromAssemblies(assembly)
            .AddClasses(classes => classes.AssignableTo(typeof(IMyInterface)))
            .AsImplementedInterfaces()
            .WithTransientLifetime();
    });

 

Zachęcam Ciebie do zapoznania się z projektem. Na GitHubie znajdziesz dwa przykłady kodu, które pokazują użycie zarówno skanowania jak i dekoracji. Tak proste, a tak przydatne. Aż dziw, że nie zostało to jeszcze „wciągnięte” to Microsoft.Extensions.DependencyInjection. Pożyjemy, zobaczymy 😉

You may also like...