web-dev-qa-db-fra.com

Asp.Net Core: enregistrer l'implémentation avec plusieurs interfaces et style de vie Singleton

En tenant compte des définitions d'interface et de classe suivantes:

public interface IInterface1 { }
public interface IInterface2 { }
public class MyClass : IInterface1, IInterface2 { }

existe-t-il un moyen d'enregistrer une instance de MyClass avec plusieurs interfaces comme celle-ci:

...
services.AddSingleton<IInterface1, IInterface2, MyClass>();
...

et résolvez cette seule instance de MyClass avec différentes interfaces comme celle-ci:

IInterface1 interface1 = app.ApplicationServices.GetService<IInterface1>();
IInterface2 interface2 = app.ApplicationServices.GetService<IInterface2>();
39
Maxim

La collection de services par définition est une collection de ServiceDescriptors, qui sont des paires de type de service et de type d'implémentation.

Vous pouvez cependant contourner cela en créant votre propre fonction de fournisseur, quelque chose comme ça (merci user7224827):

services.AddSingleton<IInterface1>();
services.AddSingleton<IInterface2>(x => x.GetService<IInterface1>());

Plus d'options ci-dessous:

private static MyClass ClassInstance;

public void ConfigureServices(IServiceCollection services)
{
    ClassInstance = new MyClass();
    services.AddSingleton<IInterface1>(provider => ClassInstance);
    services.AddSingleton<IInterface2>(provider => ClassInstance);
}

Une autre façon serait:

public void ConfigureServices(IServiceCollection services)
{
    ClassInstance = new MyClass();
    services.AddSingleton<IInterface1>(ClassInstance);
    services.AddSingleton<IInterface2>(ClassInstance);
}

Où nous fournissons simplement la même instance.

40
juunas

Vous pouvez encapsuler la réponse de user7224827 pour créer une méthode d'extension Nice correspondant à votre API souhaitée d'origine:

    public static class ServiceCollectionExt
    {
        public static void AddSingleton<I1, I2, T>(this IServiceCollection services) 
            where T : class, I1, I2
            where I1 : class
            where I2 : class
        {
            services.AddSingleton<I1, T>();
            services.AddSingleton<I2, T>(x => (T) x.GetService<I1>());
        }
    }
3
daw