web-dev-qa-db-fra.com

Injection de dépendance .NET Core Compatibilité descendante avec .NET Framework?

Je souhaite reconstruire une bibliothèque .NET Framework en .NET Core, puis utiliser cette bibliothèque dans l'application .NET Framework.

La bibliothèque a besoin d'une chaîne de connexion à la base de données. Dans .NET Core, j'utilisais Dependency Injection pour transmettre la configuration avec la chaîne de connexion à la classe de bibliothèque.

public MyRepository(IConfiguration config)
{
    _connectionString = config.GetConnectionString("MyDb");
}

Mais comment utiliser cette classe à partir de la bibliothèque .NET Framework 4.6 sans introduire de structures DI complexes?

4
fantastischIdee

J'utilise déjà les nouvelles bibliothèques Microsoft.Extensions dans .NET Framework 4.7.1, principalement les bibliothèques DependencyInjection et Configuration .

Les bibliothèques 2.x sont compatibles avec .NET Standard 2.0, ce qui signifie qu’elles peuvent être ajoutées aux applications qui ciblent tous les environnements d’exécution compatibles avec .NET Standard 2.0, c’est-à-dire .NET Framework 4.7.1 et ultérieur ou .NET Core 2.0 et ultérieur .

Dans les environnements d'exécution plus anciens (4.6.1 et versions ultérieures), NuGet peut être amené à ajouter des packages supplémentaires avec des versions plus récentes de certains assemblys système, par exemple System.Runtime.

Vous ne pouvez pas ajouter les packages 2.0 Extension à la version 4.6. Vous pouvez ajouter les anciennes versions 1.x utilisées dans .NET Core 1.x.

Configuration les extensions se font de la même manière dans .NET Core et Full Framework:

  1. Vous créez un ConfigurationBuilder, ajoutez des fournisseurs de configuration et appelez Build () à la fin pour obtenir un objet IConfigurationRoot

    IConfigurationRoot configRoot = new ConfigurationBuilder()
        .AddUserSecrets<Program>()
        .AddJsonFile($"appsettings.json")
        .Build();
    
  2. Créez un ServiceCollection, enregistrez des services et appelez BuildServiceProvider() pour obtenir une ServiceProvider. Vous utiliserez ce fournisseur de services pour créer des instances de classes nécessitant une injection.

ASP.NET Core, qui fonctionne également sur l’infrastructure Full, fournit des bibliothèques d’aide supplémentaires qui masquent le code standard. 

IServiceCollection services = new ServiceCollection();
ServiceProvider provider= services.AddSingleton<MyService>()
                                  .AddTransient<AnotherService>()
                                  .AddTransient<ServiceThatNeedsTheOthers>()
                                  .BuildServiceProvider();

En supposant que le troisième service est:

public class ServiceThatNeedsTheOthers
{
    public ServiceThatNeedsTheOthers(MyService s1,AnotherService s2){..}
}

Vous pouvez le créer avec:

var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();

Tout cela est décrit dans la colonne Essential .NET de Mark Michaelis dans MSDN Magazine, par exemple Injection de dépendances avec .NET Core et Configuration dans .NET Core . Les articles montrent comment installer et utiliser les applications Extensions dans la console sur lesquelles vous devez écrire tous les standards.

PSASP.NET Core 2.0 peut également cibler le framework Full. Pour une nouvelle application Web, il peut être judicieux de créer un projet ASP.NET Core 2.0 ciblant 4.7.1. 

7
Panagiotis Kanavos

Le scénario que vous décrivez correspond à ce que .NET Standard est destiné à réaliser. Seul un projet de bibliothèque de classe peut cibler .netstandard et toute bibliothèque de ce type est compatible avec les applications .NET Framework les plus récentes ainsi qu'avec les applications .NET Core.

Les assemblys .NET Core dans Microsoft.Extensions.DependencyInjection et Microsoft.Extensions.Configuration sont également compatibles avec .netstandard, ce qui signifie que vous pouvez les utiliser dans votre bibliothèque et dans vos applications.

Donc, oui, vous pouvez utiliser .NET Core DI avec .NET Framework, et dans un scénario de bibliothèque, il vous suffit de vous en tenir aux API .NET Standard. Cela fonctionnera également avec toutes les implémentations .NET. J'ai des bibliothèques .netstandard20 très volumineuses et très compliquées que j'utilise avec des applications ciblant les deux frameworks, et j'ai rarement besoin de me demander si une API donnée est compatible car la couverture est excellente, mais vous pouvez trouver la liste complète ici .

0
McGuireV10