2

この質問の回答に基づいて: ninject を使用した循環依存とこの質問: Ninject: 解決される子に親インスタンスを与える両方とも、スコープをデフォルトの Transient Scope にはなりません。だから私はそれをやってみました、私はお互いを必要とする aUserServiceと aを持っGroupServiceています (そして、クラスを変更したり、3 番目のクラスを使用したりしないでください!)。EntityServiceFactory次のように ninject を使用するジェネリックがあります。

public static class EntityServiceFactory
{
    public static TServiceClass GetService<TServiceClass>()
        where TServiceClass : class
    {
    IKernel kernel = new StandardKernel();
    return kernel.Get<TServiceClass>();
    }
}

そして私のサービス:

public class GroupService : EntityService<GroupRepository, Group, DbContext>
{
    public UserService _userService { private get; set; }


    public GroupService(GroupRepository repository, UserService userService) : base(repository)
    {
        userService._groupService = this;
    }

public class UserService : EntityService<UserRepository, User, DbContext>
{
    public GroupService _groupService { private get; set; }

    public UserService(UserRepository repository, GroupService groupService)
        : base(repository)
    {
        groupService._userService = this;
    }

次に、これらの質問に対する回答の指示に従って、次を my に追加しますEntityServiceFactory

kernel.Bind<GroupService>().ToSelf().InCallScope();
kernel.Bind<UserService>().ToSelf().InCallScope();

しかし、私はまだエラーが発生します:

2 つのサービスのコンストラクター間で循環依存関係が検出されました。

双方向のプロパティ注入を正しく行っていますか? これを解決するにはどうすればよいですか?

4

1 に答える 1

2

ウェルプ、私がリンクした質問の答えを理解していなかったことがわかりました。私はプロパティインジェクションのようなことはまったくしませんでした.私がやったことはこれでした:

循環的な依存関係があるときはいつでも、コンストラクターから循環を誘発するサービスの 1 つを削除し、これに置き換えます。

    private UserService _userService;
    private UserService UserService
    {
        get { return _userService ?? (_userService = EntityServiceFactory.GetService<UserService>()); }
    }

これは実際には、プロパティ インジェクション ( http://ninject.codeplex.com/wikipage?title=Injection%20Patterns )に非常に近いものになりました。コンストラクター注入ほど最適ではありませんが、それでも悪い解決策ではありません。私もこれを行うことができました(実際のプロパティの注入):

    private UserService _userService;
    [Inject]
    private UserService UserService
    {
        get { return _userService; }
        set { _userService = value; }
    }

サービスの使用方法を変更した場合に備えて、サービスに特定のコードを挿入する必要がないため、私は自分の方法を選択しましたが、呼び出されEntityServiceFactory.GetServiceたものは本質的に属性と同じことを行い[Inject]ます。

于 2013-07-25T20:22:10.463 に答える