2017-02-15 27 views
0

現在、Windowsフォームアプリケーションの構造を作成しています。依存関係注入を実装する際にNULL REFERENCEエラーが発生しました。私は簡単な単体テストのためにこの種のアプローチをMVCアプリケーションで使用していましたが、ここでWindowsフォームアプリケーションで実装する方法を理解できません。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 
    } 
} 

はここでここで

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インタフェースを継承しているクラスは、私のIServiceTasksインタフェース

public interface IServiceTasks 
{ 
    bool CreateAssignment(); 
} 

ですIInterfaceTasksインターフェイスの場合

public interface IInterfaceTasks 
{ 
    bool CreateAssignments(IEntities.AssignmentEntityRequest request); 
} 

どうすればこの権利を実装できますか?

更新: PWSは、あなたの問題は、Windowsフォームを作成し、デフォルトコンストラクタでInitializeComponent()を呼び出していないということですここ

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     IInterfaceTasks tasks = new pws(); 
     Application.Run(new pws(tasks)); 
    } 
+0

?デフォルトのコンストラクタは実際のFormとして機能し、もう1つはメンバ変数を設定するので、とにかく完全に動作することはできません。 –

+0

あなたの質問の回答を見るには、私のアップデートをご覧ください。ありがとう@SamKuhmonen! – vonndutch

+0

はい、ここでは、デフォルトコンストラクタを呼び出してオブジェクトを作成しています。 '_tasks'変数に何も設定していないので、常にnullになります。依存性注入フレームワークが必要な場合、またはコードを5つのパラメータに変更しても、 'InitializeComponent()'を呼び出す必要があります。 –

答えて

4

と呼ばれています。

だからあなたpwsクラスは、このような単一のコンストラクタを必要とします:

public pws(IInterfaceTasks tasks) 
    { 
     InitializeComponent(); 
     _tasks = tasks; 
    } 

またはこのようなあなたの複数のコンストラクタ:

public pws() 
    { 
     InitializeComponent(); 
    } 
    public pws(IInterfaceTasks tasks) : this() 
    { 
     _tasks = tasks; 
    } 

私はあなたがいないしているので、高度、に最初のオプションをお勧めしますサービスロケータパターン(私が推測/推測するもの)を使用しています。それはダイビングに値するものではない全く別の話題です。

これは、コンストラクタのオーバーロードの典型的な例です。 Main()メソッドでは、IInterfaceTasks実装のインスタンスを取得またはインスタンス化し、pwsコンストラクタに渡す必要があります。

だからあなたのコードは次のようになりますどのようにあなたが `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

それを稼働させました!インターフェイスを実装しているクラスにちょうどうんざりしました。 – vonndutch

関連する問題