c# - 如何在 WinForms 中正确实现 Di
问题描述
我正在构建一个 Winforms 应用程序。我的项目很少 主要项目是 winforms 项目 我有 DB 项目(使用 EF 核心)和带有我的服务的业务项目 我正在使用 Ninject 进行业务服务的 DI 注入。我正在使用我所有注册的绑定在主窗体中初始化 StandartKernel。因此,当我从主窗体打开一个窗体时,我会将所需的服务从内核传递给窗体的构造函数。问题是当我想从其他表单(不是主表单)创建表单时示例:从主表单我创建 ClientForm 但我想向客户的集合“汽车”添加一个新对象,所以我想创建一个汽车直接从 ClientForm 形成。这就是问题所在:在 ClientForm 中,我没有将 CarService 传递给新表单,我只有 ClientService。在这样的项目中进行 DI 的最佳解决方案是什么?我正在考虑让我的所有服务都静态,但是......还有其他解决方案吗?
解决方案
好吧,这些天我正在处理类似的事情。我正在使用Unity Container
来制作我的 DI。代码并不完全完整,根本没有优化。
如果您看过或使用过 ASP.NET API,我尝试在 Windows 窗体应用程序中进行相同的操作。
我使用如下扩展方法将我的所有表单添加到 Unity Container。
public static void AddForms(this IUnityContainer container, Assembly assembly = null)
{
if (assembly == null) assembly = Assembly.GetCallingAssembly();
foreach (var form in assembly.GetTypes().Where(x => typeof(Form).IsAssignableFrom(x)))
{
var initForm = form.GetCustomAttribute<InitialFormAttribute>();
if (initForm != null)
{
container.RegisterType(typeof(Form), form, "InitialForm", new TransientLifetimeManager());
}
else
{
container.RegisterType(form, new TransientLifetimeManager());
}
}
}
并使用一些编码来实现启动,就像在 ASP.NET 中一样。在启动时,我将 EF Core DbContext 添加到容器中,就像我添加了能够简单地让 Unity 容器为我创建表单实例所需的一切一样,并且我始终可以访问表单中的服务。
如果您想查看完整代码,请在下方评论。
推荐阅读
- javascript - 多次按下按钮问题
- php - Laravel 5如何检查用户是否存在于我的另一个表中
- c - fscanf Issue-Not able to extract string from file
- antivirus - How to stop antivirus false positives everytime we re-release software?
- twig - Using Twig to access HTML content
- javascript - 为什么这个 console.log() 函数不起作用?
- c++ - 是否有在模板中使用数值的有效方法?
- c# - .NET 运行时错误 80131506 - 将 Lambda 传递给本机函数
- python - “变换”Numpy 数组:移动维度
- winforms - 继承和自定义 Windows 窗体轨迹栏控件