0

は、私は基本的にFooBaseは、コンストラクタを介して設定をCLASユニティコンテナ - レイジー注入

class Foo : FooBase { 

    public Foo(Settings settings, IDbRepository db) 
    : base(settings) { 
     this.db = db; 
    } 

    ... 

} 

を受信して​​、コンフィギュレーションファイルからいくつかの設定をロードしているとしましょう。

その後、私はIDbRepository

私が持っているのProgram.csで
class MySQLRepository : IDbRepository { 

    ... 

    public MySQLRepository(IConfigurationRepository config) { 
    conn = new MySQLConnection(config.GetConnectionString()); 
    } 

    ... 

} 

を実装するクラスのMySQLRepositoryを持っている:

Foo foo = container.Resolve<Foo>(); 

問題はFooBaseのコンストラクタは、他のすべての依存関係があった後にのみ呼び出されることですロードされる。 FooBaseコンストラクターが呼び出されるまで、構成はロードされません。

私の考えは、IDbRepositoryと設定が必要な他のすべてのインターフェイスの遅延実装を作成することです。

これは良い考えですか? Unityコンテナでどのように実装しますか?

+2

* FooBaseのコンストラクタは、他のすべての依存関係がロードされた後にのみ呼び出されるという問題があります。 FooBaseコンストラクタが呼び出されるまで、コンフィグレーションはロードされません。あなたは言おうとしていますか?何故ですか?あなたのDIコンテナに登録の問題がありますか? 'IConfigurationRepository'は' MySQLRepository'の依存関係で、 'Foo'の依存関係である' IDbRepository'として解決されています。依存関係グラフはかなり正直なので、あなたが直面している問題はありません。 (btw: 'IDbRepository'は' FooBase.ctor'に接続されていません) –

+0

config.GetConnectionString()は、アプリケーション設定にアクセスします。しかし、アプリの設定はBaseFooコンストラクタでのみロードされます(私はそのクラスにアクセスできません)。 BaseFooのコンストラクタが呼び出される前に、UnityはIDbRepositoryを解決します(そしてMySQLRepositoryのコンストラクタを呼び出します)。基本的に、設定から接続文字列を読み込もうとするMySQLRepositoryコンストラクタは、接続文字列が(BaseFooコンストラクタの)アプリケーション設定から取得される前に呼び出されます。 – areller

+1

循環依存関係を持つコードは、非常に難しいです。コードを見ている人が遅れて読み込むよりも賢明な方法で循環依存を取り除くほうがはるかに良いでしょう。 –

答えて

2

Deferring the Resolution of Objectsをお探しですか?

class Foo : FooBase { 
    Lazy<IDbRepository> _db; 
    public Foo(Settings settings, Lazy<IDbRepository> db) 
    : base(settings) { 
    _db = db; 
    } 
} 
関連する問題