我目前正在创建一个Windows窗体应用程序的结构。我在实现依赖注入时遇到了NULL REFERENCE错误。我在我的MVC应用程序中使用这种方法来进行简单的单元测试,但是无法弄清楚如何在windows窗体应用程序中实现它。
这是Main表单的部分类:
public partial class pws : Form
{
private IInterfaceTasks _tasks { get; set; }
public pws(IInterfaceTasks tasks)
{
InitializeComponent();
_tasks = tasks;
}
private void cmdSave_Click(object sender, EventArgs e)
{
IEntities.AssignmentEntityRequest request = new IEntities.AssignmentEntityRequest();
<code mapping here>
_tasks.CreateAssignments(request); --> _tasks here is null
}
}
这是继承IServiceTasks接口的类
public class CreateAssignmentsInterface : IInterfaceTasks
{
private Service.IServiceTasks _task;
public CreateAssignmentsInterface(Service.IServiceTasks task)
{
_task = task;
}
public bool CreateAssignments(IEntities.AssignmentEntityRequest request)
{
Helpers.Helpers mapper = new Helpers.Helpers();
var assignmentRequest = new SEntities.AssignmentEntityRequest();
assignmentRequest = mapper.MapInterfacetoServiceRequest(request);
_task.CreateAssignment(); --> _task here is null
return true;
}
}
这是我的IServiceTasks接口
public interface IServiceTasks
{
bool CreateAssignment();
}
对于IInterfaceTasks界面
public interface IInterfaceTasks
{
bool CreateAssignments(IEntities.AssignmentEntityRequest request);
}
有人可以帮我解决这个问题吗?
更新: pws在这里被称为
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
IInterfaceTasks tasks = new pws();
Application.Run(new pws(tasks));
}
答案 0 :(得分:4)
您的问题是您正在创建Windows表单而不是在默认构造函数中调用InitializeComponent()
。
所以你的pws
类需要一个像这样的构造函数:
public pws(IInterfaceTasks tasks)
{
InitializeComponent();
_tasks = tasks;
}
或者像你这样的多个构造函数:
public pws()
{
InitializeComponent();
}
public pws(IInterfaceTasks tasks) : this()
{
_tasks = tasks;
}
我强烈建议第一个选项,因为您没有使用服务定位器模式(根据我的推断/假设)。这是一个完全不同的话题,不值得深入探讨。
这是构造函数重载的典型示例。在Main()
方法中,您需要获取/实例化IInterfaceTasks
实现的实例并将其传递给pws
构造函数。
所以你的代码看起来像这样:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
IInterfaceTasks interfaceTasks = new **SOME CLASS THAT IMPLEMENTS IInterfaceTasks**
Application.Run(new pws(interfaceTasks));
}