如何在 Winforms C# 中定义依赖注入?
接口IC类别:
public interface ICategory
{
void Save();
}
类类别存储库:
public class CategoryRepository : ICategory
{
private readonly ApplicationDbContext _context;
public CategoryRepository(ApplicationDbContext contex)
{
_context = contex;
}
public void Save()
{
_context.SaveChanges();
}
}
Form1:
public partial class Form1 : Form
{
private readonly ICategury _ic;
public Form1(ICategury ic)
{
InitializeComponent();
_ic=ic
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm= new Form2();
frm.show();
}
}
Form2:
public partial class Form2 : Form
{
private readonly ICategury _ic;
public Form2(ICategury ic)
{
InitializeComponent();
_ic=ic
}
}
Problem?
-
Program.cs中依赖注入的定义
Application.Run(new Form1());
-
Form 2 调用时依赖注入的定义
Form2 frm= new Form2();
frm.show();
如何在 Windows 窗体 (WinForms) 中使用依赖注入 (DI)
要在 WinForms .NET 5 或 6 中使用 DI,您可以执行以下步骤:
-
创建 WinForms .NET 应用程序
-
安装 Microsoft.Extensions.Hosting 包(它为您提供了一系列有用的功能,例如 DI、日志记录、配置等)
-
添加新界面,IHelloService.cs
:
public interface IHelloService
{
string SayHello();
}
-
为您的服务添加新的实现HelloService.cs
:
public class HelloService : IHelloService
{
public string SayHello()
{
return "Hello, world!";
}
}
-
修改Program.cs
:
//using Microsoft.Extensions.DependencyInjection;
static class Program
{
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var host = CreateHostBuilder().Build();
ServiceProvider = host.Services;
Application.Run(ServiceProvider.GetRequiredService<Form1>());
}
public static IServiceProvider ServiceProvider { get; private set; }
static IHostBuilder CreateHostBuilder()
{
return Host.CreateDefaultBuilder()
.ConfigureServices((context, services)=>{
services.AddTransient<IHelloService, HelloService>();
services.AddTransient<Form1>();
});
}
}
现在您可以注入IHelloService
in Form1
并使用它:
//using Microsoft.Extensions.DependencyInjection;
public partial class Form1 : Form
{
private readonly IHelloService helloService;
public Form1(IHelloService helloService)
{
InitializeComponent();
this.helloService = helloService;
MessageBox.Show(helloService.SayHello());
}
}
如果你想展示Form2
使用DI,首先需要注册services.AddTransient<Form2>();
,然后根据 Form2 的使用情况,您可以使用以下选项之一:
-
如果您只需要一个实例Form2
在一生的时间里Form1
,然后您可以将其作为依赖项注入到构造函数中Form1
并存储实例并在需要时显示它。
但请注意:它只会在您打开时初始化一次Form1
并且不会再次初始化。您也不应该处置它,因为它是传递给的唯一实例Form1
.
public Form1(IHelloService helloService, Form2 form2)
{
InitializeComponent();
form2.ShowDialog();
}
-
如果您需要多个实例Form2
或者你需要多次初始化它,那么你可能会得到它的一个实例,如下所示:
using (var form2 = Program.ServiceProvider.GetRequiredService<Form2>())
form2.ShowDialog();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)