66 votes

Asp.Net Core: le registre de la mise en œuvre avec de multiples interfaces et le mode de vie Singleton

Compte tenu de la suite de l'interface et des définitions de classe:

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

est-il possible d'enregistrer une instance de l' MyClass avec de multiples interfaces comme ceci:

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

et de résoudre cette instance unique d' MyClass avec différentes interfaces comme ceci:

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

59voto

juunas Points 19242

Le service de collecte, par définition, est une collection d' ServiceDescriptors, qui sont des paires de type de service et la mise en œuvre de type.

Cependant, vous pouvez contourner ce problème en créant votre propre fournisseur de fonction, quelque chose comme cela (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);
}

D'où nous vient de fournir la même instance.

13voto

daw Points 381

Vous pouvez envelopper user7224827 la réponse de créer une belle méthode d'extension correspondant à votre original souhaitée de l'API:

    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>());
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X