5

依存性注入の概念を理解しようとしています。以下は、デバッグしようとしている例です。ここで、彼のコンストラクターに依存関係を注入した Customer クラスを作成しました。メソッドを呼び出すと、エラーが発生し、キーワードを使用しthis.Iorder.GetOrderDetails();てメソッドを呼び出すオブジェクトを作成するように求められます。この呼び出しを別のメソッドに移動し、そのメソッドを Index Method で呼び出すと、機能します。IndexNullReferenceExceptionnewthis.Iorder.GetOrderDetails();GetCutomerDetails()

質問this.Iorder.GetOrderDetails(): メソッド呼び出しがメソッドで機能しない Index理由と、メソッドで機能する理由を理解できませんGetCutomerDetails()

public  interface IorderDetails
{
    void GetOrderDetails();
}

public class CustomerModel : IorderDetails
{
    public void GetOrderDetails() {}
}

コントローラ:

public class CustomerController: Controller
{
    private IorderDetails Iorder;

    //DI constructor  Injecting OrderDetails object 
    CustomerController(IorderDetails iorderObj)
    {
        if (iorderObj == null)
            throw new ArgumentNullException("orderObj should not be null");

        this.Iorder = iorderObj;
    }
    //Default constructor  
    public CustomerController() { }

    public ActionResult Index()
    {            
       CustomerController objCustomer = new CustomerController(new CustomerModel());
       objCustomer.GetCutomerDetails();

       //Commented GetOrderDetails() method
       //this.Iorder.GetOrderDetails();            
       return View();
    }

    public ActionResult GetCutomerDetails()
    {
        this.Iorder.GetOrderDetails();
        return View();
    }
}
4

1 に答える 1

2

のデフォルトコンストラクタがありますCustomerController。呼び出されたとき、 には何も割り当てませんIorder。その場合はnullそうです。その後、メソッドで null であるを使用してIndex()メソッドを実行しようとします。これは失敗します。内部メソッドの別のインスタンスを作成すると、そのインスタンスを呼び出すことができます。GetOrderDetails()IorderCustomerControllerIndex()GetOrderDetails()

一般に、依存性注入と組み合わせる場合、複数のコンストラクターを使用することはお勧めできません。ただし、必要な場合は、すべてのインスタンス フィールドを機能するものに初期化する必要があります。これは、ローカル デフォルトと呼ばれます。Dependency Injection のパターンとアンチパターンに関する優れた書籍は、Dependency Injection in .NETです。作者のブログも参考にしてください。

于 2013-09-24T10:16:24.113 に答える