gpt4 book ai didi

winforms - 使用 Ninject 和 Entity Framework 在 WinForms 中进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-02 10:41:45 25 4
gpt4 key购买 nike

我目前正在开发一个项目,我们正在将旧的数据集、存储过程 WinForm 应用程序转换为使用 Entity Framework ,以便新网站可以访问相同的对象模型和存储库。

无论如何,我正在尝试将依赖注入(inject)实现到表单中,以便我们可以使用模拟存储库进行单元测试。我使用 Ninject 的原因很简单,我之前在 MVC 网站中使用过它,但是,尝试在 WinForm 应用程序中实现这一点至少可以说是有问题的,由于 WinForms 中缺乏有关 DI 的信息,这进一步阻碍了我的工作。网络。

到目前为止,我已经创建了 Ninject Factory 和存储库,但我在将存储库注入(inject)表单方面运气不佳。

因此有人可以帮助我或提出任何建议吗?

下面是我的部分代码可能会有所帮助:

Ninject 工厂:

public class NinjectFactory : NinjectModule
{
private IKernel _ninjectKernel;

public NinjectFactory()
{
_ninjectKernel = new StandardKernel();
}

public override void Load()
{
_ninjectKernel.Bind(typeof(IRepository<>)).To(typeof(GenericRepository<>));
_ninjectKernel.Bind(typeof(IProductionRepository)).To(typeof(ProductionRepository));
}
}

带有存储库的表单:

Public Class TaskForm
Inherits BaseBusinessDialogForm

Private _repository As TaskRepository
Private _task As Production.Task = Nothing

Public Sub New(ByVal task As Production.Task)

InitializeComponent()

_repository = New TaskRepository(ConnectString)

If task.TaskID = 0 Then
_task = task
Else
_task = _repository.GetByID(task.TaskID)
End If

MyBase.BusinessObject = _task
Me.TaskBindingSource.DataSource = MyBase.BusinessObject

End Sub

启动包含上述表单的 MDI 表单的类:

Dim kernel As IKernel = New StandardKernel(New NinjectFactory())
''Dim kernel As IKernel = New StandardKernel(New NinjectFactoryTest())
mfrmMDI = kernel.Get(Of Forms.MDI)()

Application.DoEvents()
mfrmMDI.ShowDialog()

我知道我的问题有点模糊,但我不确定问题出在哪里或我需要完成什么。

非常感谢

最佳答案

您创建合成根作为您的决议的一个入口点。您将 INjectModule 作为参数传递,以便可以对其进行不同的测试配置。 Composition Root 的好处之一是,并非所有程序集都依赖于 NInject,并且您将通过一个点来更改解析逻辑。当您将来可能更改 IoC 容器或引入一些动态拦截时,这确实是一个很酷的模式。

public class CompositionRoot
{
private static IKernel _ninjectKernel;

public static void Wire(INinjectModule module)
{
_ninjectKernel = new StandardKernel(module);
}

public static T Resolve<T>()
{
return _ninjectKernel.Get<T>();
}
}

你的模块看起来像这样

public class ApplicationModule : NinjectModule
{
public override void Load()
{
Bind(typeof(IRepository<>)).To(typeof(GenericRepository<>));
}
}

在 main 方法中,您将 ApplicationModule 作为参数传递,并解析 Form1 并启动它。

[STAThread]
static void Main()
{
CompositionRoot.Wire(new ApplicationModule());

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

Application.Run(CompositionRoot.Resolve<Form1>());
}

Form1 构造函数中,您传递具有特定封闭通用参数的所需存储库

public partial class Form1 : Form
{
private IRepository<Process> _processRepository;

public Form1(IRepository<Process> productionRepository)
{
this._processRepository = productionRepository;
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(_processRepository.ToString());
}
}

您的存储库可能非常复杂,但我不会向它们添加任何功能,而是添加 ToString() 方法,以便我们可以查看依赖项是否已正确解析。请注意,存储库上没有任何属性。

public interface IRepository<T>
{
}

public class GenericRepository<T> : IRepository<T>
{
public override string ToString()
{
return "MyRepository with type : "+typeof(T).Name;
}
}

现在,当您运行应用程序时,您将看到所有内容均已连接,并且消息框显示封闭类型为 Process

enter image description here

关于winforms - 使用 Ninject 和 Entity Framework 在 WinForms 中进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14127763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com