WindowsForm应用程序C#

时间:2017-02-15 17:17:45

标签: c# winforms dependency-injection interface

我目前正在创建一个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));
    }

1 个答案:

答案 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));
}