Comme actuellement, il y a un manque de documentation sur le sujet DI - injection de dépendance . Quels sont les avantages/inconvénients de l'utilisation de la DI intégrée par rapport aux solutions existantes comme (Ninject, Autofac, StructureMap)? Et quelles sont les limitations actuelles de l'injection de dépendance par défaut (le cas échéant)?
De plus, quelqu'un peut-il m'aider à comprendre quelle est la différence entre ces enregistrements?
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IService, Service>();
services.AddScoped<IService, Service>();
services.AddSingleton<IService, Service>();
services.AddInstance(service);
}
Pour le développement de produits de toute application de taille raisonnable qui pratique un couplage lâche et suit les principes SOLID, le conteneur DI de .NET Core n'est pas adapté, car:
Service1
et Service2
que les deux dépendent de ILogger
, vous voudrez peut-être injecter Service1
avec NullLogger
et Service2
avec FileLogger
, ou vous voulez Service1
à injecter avec Logger<Service1>
et Service2
avec Logger<Service2>
.La principale raison de ces limitations est que le conteneur intégré a pour objectif de fournir des capacités DI en particulier au cadre lui-même, tout en maintenant ses fonctionnalités au minimum dans l'espoir que des conteneurs DI plus matures pourraient s'intégrer avec ça. En d'autres termes, il agit comme un dénominateur le moins commun (LCD). En raison de sa fonction LCD LCD, il ne peut jamais devenir un conteneur DI à taille réelle qui est pratique pour le développement d'applications.
Si vous commencez avec un nouveau projet simple, mon conseil est d'appliquer Pure DI (ce qui signifie des composants câblés à la main à l'intérieur de Composition Root sans en utilisant un conteneur) et résolvez vos types en branchant votre IControllerActivator personnalisé . Plus tard, lorsque des fonctionnalités telles que l'enregistrement automatique et l'interception amélioreraient la maintenabilité de votre racine de composition, passez à l'une des bibliothèques DI établies qui correspond à vos besoins.
Ici, il est expliqué:
La version Alpha avait ces limitations:
Si vous n'écrivez pas, le conteneur DI par défaut du produit devrait être suffisant pour vous. Dans d'autres cas, vous pouvez essayer des bibliothèques que vous avez déjà mentionnées qui ont des fonctionnalités avancées.
Mon conseil serait de commencer par celui par défaut et de changer l'implémentation quand (si) vous frappez quelque chose que vous ne pouvez pas faire avec.
Quelle est la différence entre ces inscriptions?
Source: http://www.khalidabuhakmeh.com/asp-vnext-dependency-injection-lifecycles , http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps /
Pour répondre à votre première question: il semble que ASP.NET docs ont été mis à jour et indiquent maintenant clairement quel est chaque type d'enregistrement pour:
Les services ASP.NET peuvent être configurés avec les durées de vie suivantes:
Transitoire
Des services transitoires à vie sont créés chaque fois qu'ils sont demandés. Cette durée de vie fonctionne mieux pour un service léger et sans état.
Portée
Les services à vie étendus sont créés une fois par demande.
Singleton
Les services à vie Singleton sont créés la première fois qu'ils sont demandés, puis chaque demande suivante utilise la même instance. Si votre application nécessite un comportement singleton, il est recommandé d'autoriser le conteneur de services à gérer la durée de vie du service au lieu d'implémenter le modèle de conception singleton et de gérer vous-même la durée de vie de votre objet dans la classe.
Instance [pre RTM uniquement!]
Vous pouvez choisir d'ajouter une instance directement au conteneur de services. Si vous le faites, cette instance sera utilisée pour toutes les demandes suivantes (cette technique créera une instance de portée Singleton). Une différence clé entre les services d'instance et les services Singleton est que le service d'instance est créé dans ConfigureServices, tandis que le service Singleton est chargé paresseux la première fois qu'il est demandé.
Mis à jour en RTM
Notez que dans Asp.Net Core RTM docs L'instance a été supprimée. L'instance est fondamentalement la même chose que Singleton, mais ils avaient une sémantique d'initialisation différente (Singleton était chargé paresseusement) Mais maintenant il n'y a pas d'API AddInstance, seulement AddSignleton qui peut prendre une instance déjà créée.