2016-11-17 28 views
-2

私はおおよそ次のようなインタビューの質問を受けました:依存関係注入では、どのようにすべてのクラスがインスタンス化されないようにしますか?もしあなたがほんの少しだけ欲しいならば、全部ではないでしょうか?彼らはすべてが同時に記憶に残らないようにするなど、良い理由があります。依存関係注入によるクラスのインスタンス化を防ぐにはどうすればいいですか?

私はこの質問を研究しようとしましたが、最良の検索語を理解することは難しいです。そして答えは見つけられませんでした。

+2

想定される質問は意味をなさない。 「すべてのクラス」をインスタンス化するDIコンテナは存在しないため、「すべて同時に」メモリに格納されます。コンテナは要求されたものだけをインスタンス化します。したがって、有効な意味はありませんが、「コンテナがインスタンスを作成するのを防ぐ方法はインスタンスを要求しない」ことができます。私たちはあなたがより良い答えを提案するために記憶していたより多くを必要とすると思います。 –

+0

私はこの質問をするより良い方法を知らない。それはインタビューでトリックな質問かもしれません。知りません。私はそれが広いこと、それが保留中であることなどが嫌いです。私はこの質問をどのようにしてより良く、より広範にすることができるかについての提案なしでdownvotedになるのは嫌です。 @WiktorZychla - あなたのフィードバックに感謝します。 – NovaDev

+0

私はあなたを落胆させた人ではありませんでした。提案について - 私は、あなたが質問として尋ねたことが意味をなさないとあなたに説明しようとしました。だから、質問はどういうわけか(実際の答えが可能なように)異なっていたか、あなたが聞いていることを知らない人に質問された無効な質問があった。あなたが受け入れる答えでさえ、DIにそのようなことがないので、「インスタンス化の防止」を求めるのは理にかなっていないと言います。 –

答えて

1

簡単な方法は、コンストラクタを使用してそれを作成し、フラグまたはスイッチに基づいて単一のクラスをインスタンス化することです。ここでは、単一のOtherClassまたはOtherClass2がインスタンス化されることを示す簡単な例を示します。

ただし、インスタンス化の防止を可能にするのは実際に依存性注入ではないことを追加したいと思います。あなたはDIを取り除き、緊密に結合したクラスを持っていても、クラスの単一のインスタンスを持つことができます。だから多分私は質問を正しく理解していないか、あるいはインタビュアーが異なる文脈でそれを尋ねたのでしょうか?

class AppStart 
{ 
    OneClass One; 
    int _whatToCreate = 0; 

    public int WhatToCreate 
    { 
     get { return _whatToCreate; } 
     set { _whatToCreate = value; } 
    } 

    public void Start() 
    { 
     if (_whatToCreate > 0) 
     { 
      One = new OneClass(new OtherClass()); 
     } 
     else 
     { 
      One = new OneClass(new OtherClass2()); 
     } 

     One.PerformSomething(); 
    } 
} 

class OneClass 
{ 
    IDoSomething _doSomething; 

    public OneClass(IDoSomething doSomething) 
    { 
     _doSomething = doSomething; 
    } 

    public void PerformSomething() 
    { 
     _doSomething.DoSomething(); 
    } 
} 

class OtherClass : IDoSomething 
{ 
    public void DoSomething() 
    { 
     //throw new NotImplementedException(); 
    } 
} 

class OtherClass2 : IDoSomething 
{ 
    public void DoSomething() 
    { 
     //throw new NotImplementedException(); 
    } 
} 

interface IDoSomething 
{ 
    void DoSomething(); 
} 
+0

はい、私はこれの詳細のすべてを覚えていないかもしれません、または私は質問、または何かによって守られていた。しかし、これは良い答えです。なぜなら、これは私の一般的な考え方を反映しているからです。ありがとう! – NovaDev

関連する問題