1

依存性注入を使用するプロジェクトで、循環依存性に問題があります。周りを見回すと、再構築 (私もその一部を行いました) 以外に、それを回避する唯一の方法は、プロパティ インジェクションを使用することのようです。これを試してみましたが、役に立たないようですが、理由はわかりません。これが問題を引き起こしているパスです。

Activation path:
  6) Injection of dependency IUserRepository into property UserRepository of type ModelFactory{UserRole}
  5) Injection of dependency IUserRoleFactory into parameter userRoleFactory of constructor of type UserRoleService
  4) Injection of dependency IUserRoleService into property UserRoleService of type InternalUserBehavior
  3) Injection of dependency IInternalUserBehavior into parameter internalUserBehavior of constructor of type UserRepository
  2) Injection of dependency IUserRepository into parameter userRepository of constructor of type HomeController
  1) Request for HomeController

現在、プロパティ注入を使用していることを知っているようで、すべての動作とファクトリが同じスコープ (今はスコープを呼び出しますが、スレッド スコープも試しました) と UserRepository にあります。

プロセスについての私の理解では、それは 4 になり、実際にオブジェクトを作成できるようになるはずです。この時点で、HomeController、IUserRepository、および IInternalUserBehavior への参照が含まれているはずです。その後、5 で動作し、完成した IUserRoleService を InternalUserBehavior に挿入します。最後に、以前にインスタンス化されたユーザー リポジトリを (同じスコープ内にあるため) ModelFactory のプロパティに挿入する必要があります。

したがって、私の質問の短いバージョンは次のようになると思います:プロパティ注入が循環依存の問題を解決しないのはなぜですか?

4

1 に答える 1

1

コードを見るのに役立ちます...しかし、ここでのプロセスを理解していないと思います。

ステップ4)で、Ninject はInternalUserBehaviorプロパティを作成し、注入しています。ステップ5)で、Ninject は作成する必要があることを検出し、作成してからデータを入力するUserRoleServiceステップに進みます。6)ModelFactory{UserRole}

あなたのクラスは次のようになっていると思います:

public class UserRoleService
{
   public UserRoleService(ModelFactory<UserRole> factory){}
}

public class ModelFactory<T>
{
    [Inject]
    public IUserRepository UserRepository { get; set; }
}

プロパティの注入に関係なく、間違いなく循環依存があります。循環依存を解決する必要があります。

別のルートはLazy<IUserRepository>、循環依存を回避するためにコンストラクター注入を使用することです。その束縛に役立つ答えがあります。

事実上、あなたは次のようにModelFactory<>なります。

public class ModelFactory<T>
{
    [Inject]
    public Lazy<IUserRepository> UserRepository { get; set; }
}
于 2013-09-25T14:28:13.793 に答える