WindowsForm应用程序C#中的依赖注入

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)

Cam*_*ron 5

您的问题是您正在创建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)