我们在.NET 4.5.2中有应用程序(Web应用程序、Web API、Windows服务和Windows窗体(。所有这些应用程序都是共享库项目(使用ADO.NET的数据库层(。我们现在将逐一将这些应用程序转换为.NETCore,并启动了Web应用程序。我已经将我的库项目移植到了.NETStandard2.1,现在它与Web应用程序(.NETCore(兼容。
我们已经决定,我们不会转换Windows服务&Windwos将Form应用程序转换为.NET核心,但我们必须将数据库层转换为一个具有新技术的新项目,如实体框架核心。这个数据库层将被.NET核心使用。NET应用程序。所以我的问题是,我应该如何为数据库层创建一个可以在.NET Core和.NET中使用的新项目。NET应用程序?
有几个选项,但我很难选择其中一个,如(.NET Standard、.NET Core或.NET 4.8(请帮助我选择一个最适合我的场景的选项。
谢谢。
只有一个选项-以.NET Standard 2.0为目标,并至少将可执行项目升级到.NET 4.7.2。
为什么
.NET 4.8仍然是.NET旧版,将.NET Core与.NET旧版程序集混合使用只是权宜之计,很容易导致问题。NET Standard 2.1只能由.NET Core 3.1及更高版本使用,因此它也不是一个选项。NET 5是.NETCore5,所以除非您将所有内容迁移到它,否则它也不是一个选项。
.NET 4.7.2是必需的,因为它是唯一一个本机支持.NET Standard 2.0的版本。在早期版本中使用.NET Standard 2.0会导致依赖性崩溃,甚至MS也建议不要这样做。现在几乎所有NuGet软件包都以NS 2.0为目标,因此迁移到4.7.2是不可避免的,除非你想使用在早期版本解决了错误的旧库。NET Framework 4.5.2太旧了
更不用说TLS的情况了——4.5.2默认不使用TLS1.2,这意味着你已经需要使用HTTPS来调用服务,即使客户端和服务器操作系统都支持TLS1.3,你也无法使用它。没有HTTPS也意味着没有HTTP/2。
逐步迁移
不过,您可以逐步引入.NET核心技术,而不是迁移应用程序中的每个模块。所有的Microsoft扩展库,如依赖项注入、配置、日志记录,都是.NET标准2.0库,这意味着您也可以在.NET旧应用程序中使用它们。
您可以从将Microsoft.Extension.Logging和Configuration引入现有的.NET Framework应用程序开始。
- 您可以将ILogger实例注入任何需要日志记录的类,而不是使用全局记录器,例如通过构造函数参数
- 您可以用注入的配置对象替换对ConfigurationManager或
Properties.Settings.Default
的任何引用。无论如何,这是一个很好的设计,消除了对特定配置技术的任何依赖
DI也可以很容易地添加-Main
方法必须像.NET Core应用程序一样配置Generic Host,表单必须在其构造函数中接受依赖项。本文展示了如何做到这一点,但实际的代码很简单:
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var builder = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<Form1>();
services.AddLogging(configure => configure.AddConsole());
services.AddScoped<IBusinessLayer, BusinessLayer>();
services.AddScoped<IDataAccessLayer, DataAccessLayer>();
});
var host = builder.Build();
.
using (var scope=host.Services.CreateScope())
{
var form1 = scope.GetRequiredService<Form1>();
Application.Run(form1);
}
}
如果Form1
使用依赖注入
public partial class Form1 : Form
{
private readonly ILogger _logger;
private readonly IBusinessLayer _business;
public Form1(ILogger<Form1> logger, IBusinessLayer business)
{
_logger = logger;
_business = business;
InitializeComponent();
}
...
}
记录器和业务层实例将在调用GetRequiredService<Form1>()
时创建并传递给它。
只有netstd可以在netfx和netcore项目中使用。因此,任何共享库都必须是网络标准库。
另一个想法——尽管正如Panagiotis Kanavos所指出的,可以说是一个糟糕的想法——是使用服务体系结构。您可以在netfx或netcore中设计数据库,将其作为windows服务运行,并通过命名管道或TCP与任何其他应用程序的进程进行通信。通过这种方式,你可以将数据库留在netfx,并将你的应用程序一个接一个地转换为netcore——我认为你得到了jist。