[英].NET Core dependency injection backwards compatibility with .NET Framework?
我想將.NET Framework庫重建為.NET Core,然后在.NET Framework應用程序中使用此庫。
該庫需要一個數據庫連接字符串。 在.NET Core中,我將使用依賴注入將帶有連接字符串的配置傳遞給庫類。
public MyRepository(IConfiguration config)
{
_connectionString = config.GetConnectionString("MyDb");
}
但是,如何在不引入復雜DI框架的情況下使用.NET Framework 4.6庫中的此類?
我已經在.NET Framework 4.7.1中使用新的Microsoft.Extensions庫,主要是DependencyInjection和Configuration庫。
2.x庫與.NET Standard 2.0兼容,這意味着它們可以添加到針對與.NET Standard 2.0兼容的任何運行時的應用程序,即.NET Framework 4.7.1及更高版本或.NET Core 2.0及更高版本。 。
在較舊的運行時(4.6.1及更高版本)中,NuGet可能必須使用某些系統程序集的較新版本添加一些額外的軟件包,例如System.Runtime。
您根本無法將2.0擴展包添加到4.6。 您可以添加.NET Core 1.x中使用的舊版1.x版本。
在.NET Core和Full Framework中以相同的方式配置擴展:
您創建一個ConfigurationBuilder,添加配置提供程序並最后調用Build()以獲取IConfigurationRoot
對象:
IConfigurationRoot configRoot = new ConfigurationBuilder() .AddUserSecrets<Program>() .AddJsonFile($"appsettings.json") .Build();
創建一個ServiceCollection,注冊服務並調用BuildServiceProvider()
以獲取ServiceProvider
。 您將使用該ServiceProvider創建需要注入的類的實例。
ASP.NET Core也適用於Full框架,它提供了隱藏樣板代碼的額外幫助程序庫。
IServiceCollection services = new ServiceCollection();
ServiceProvider provider= services.AddSingleton<MyService>()
.AddTransient<AnotherService>()
.AddTransient<ServiceThatNeedsTheOthers>()
.BuildServiceProvider();
假設第三項服務是:
public class ServiceThatNeedsTheOthers
{
public ServiceThatNeedsTheOthers(MyService s1,AnotherService s2){..}
}
你可以創建它:
var service3=provider.GetRequiredService<ServiceThatNeedsTheOthers>();
所有這些都在MSDN雜志中的Mark Michaelis的Essential .NET專欄中進行了描述,例如.NET Core中的依賴注入和.NET Core中的 配置 。 這些文章展示了如何在控制台應用程序中設置和使用擴展,您需要編寫所有樣板文件。
PS ASP.NET Core 2.0也可以針對Full框架。 對於新的Web應用程序,創建面向4.7.1的ASP.NET Core 2.0項目可能是有意義的
您描述的場景是.NET Standard要實現的目標。 只有類庫項目可以以.netstandard
目標,並且任何此類庫都與最新的.NET Framework應用程序以及.NET Core應用程序兼容。
Microsoft.Extensions.DependencyInjection和Microsoft.Extensions.Configuration中的.NET Core程序集也是.netstandard
-compatible,這意味着您可以在庫和應用程序中使用它們。
所以,是的,您可以將.NET Core DI與.NET Framework一起使用,並且在庫場景中只需堅持使用.NET標准API,它也適用於所有.NET實現。 我有一些非常大的,非常復雜的.netstandard20
庫,我使用它們同時針對兩個框架的應用程序,我很少需要問自己一個給定的API是否兼容,因為現在覆蓋范圍很好,但你可以在這里找到完整的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.