von*_*tch 0 c# dependency-injection interface winforms
我目前正在创建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
}
}
Run Code Online (Sandbox Code Playgroud)
这是继承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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的IServiceTasks接口
public interface IServiceTasks
{
bool CreateAssignment();
}
Run Code Online (Sandbox Code Playgroud)
对于IInterfaceTasks接口
public interface IInterfaceTasks
{
bool CreateAssignments(IEntities.AssignmentEntityRequest request);
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我如何实施这项权利吗?
更新:这里被称为pws
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
IInterfaceTasks tasks = new pws();
Application.Run(new pws(tasks));
}
Run Code Online (Sandbox Code Playgroud)
您的问题是您正在创建Windows窗体,而不InitializeComponent()在默认构造函数中调用。
因此,您的pws类需要这样的单个构造函数:
public pws(IInterfaceTasks tasks)
{
InitializeComponent();
_tasks = tasks;
}
Run Code Online (Sandbox Code Playgroud)
或像这样的多个构造函数:
public pws()
{
InitializeComponent();
}
public pws(IInterfaceTasks tasks) : this()
{
_tasks = tasks;
}
Run Code Online (Sandbox Code Playgroud)
我强烈建议您使用第一种方法,因为您没有使用服务定位器模式(根据我的推断/假设)。这是一个完全不同的主题,不值得深入探讨。
这是构造函数重载的经典示例。在您的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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5511 次 |
| 最近记录: |