2017-02-15 3 views
0

В настоящее время я создаю структуру приложения формы окна. Я столкнулся с ошибкой NULL REFERENCE при внедрении инъекции зависимостей. Я использовал этот подход в своих приложениях MVC для легкого модульного тестирования, но не могу понять, как его реализовать здесь, в приложении Windows Form.Инъекция зависимостей в приложении WindowsForm C#

Это частичный класс главной формы:

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

Как вы инстанцировании 'pws'? Поскольку конструктор по умолчанию заставляет его работать как фактическая форма, а другой задает переменную-член, поэтому он не может полностью работать в любом случае. –

+0

см. Мое обновление, чтобы увидеть ответ на ваш вопрос. спасибо @SamiKuhmonen! – vonndutch

+0

Да, здесь вы просто создаете объект, вызывая конструктор по умолчанию. Ничто не устанавливает переменную '_sasks', так что она всегда будет нулевой. Вам нужна какая-то среда для инъекций зависимостей, или вам нужно изменить свой код на пять параметров и по-прежнему вызывать 'InitializeComponent()' –

ответ

4

Ваш вопрос в том, что вы создаете форму окна и не вызывая 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)); 
} 
+0

IInterfaceTasks tasks = new pws(); -> @Cameron, у меня есть некоторые проблемы с этим, он говорит о недостающем составе? – vonndutch

+0

заработал! просто перепутались с классом, реализующим интерфейс lol, спасибо мужчинам! – vonndutch

Смежные вопросы