Seemingly circular dependencies causing issues with Castle Windsor

后端 未结 3 1336
隐瞒了意图╮
隐瞒了意图╮ 2020-12-21 12:52

I have a IUserService (and other services) that I am registering in bulk in my ServiceInstaller.cs:

  container.Register(
                AllTypes.FromAssemb         


        
相关标签:
3条回答
  • 2020-12-21 13:32

    You need to either:

    1. Get rid of your circular dependencies (this is the preferred option), or
    2. Work around them, by using property injection, rather than constructor injection.

    Using property injection (as illustrated in Steven's answer) allows you to create instances of your classes without providing all the dependencies at the time of creation. The downside is that it is not as obvious to users of the class what they need to do to instantiate and fully configure the instance.

    For a nice explanation of how to refactor to remove a ciruclar dependency see this blog post by Miško Hevery:

    • Circular Dependency in constructors and Dependency Injection
    0 讨论(0)
  • 2020-12-21 13:50

    here's your scenario as I understand it:

    public class UserService
    {
       UserService(AuthenticationService a){}
    }
    
    public class AuthenticationService 
    {
       AuthenticationService (UserService a){}
    }
    

    How would you create instances of both classes, creating at most single instance of each class?

    0 讨论(0)
  • 2020-12-21 13:54

    Property injection will solve your problem, because it breaks the dependency cycle. Just look at Krzysztof's example and try to instantiate a UserService; You can't. Now take a look at the following example:

    public class UserService
    {
        UserService(AuthenticationService a) { }
    }
    
    public class AuthenticationService 
    {
        AuthenticationService() { }
    
        public UserService UserService { get; set; }
    }
    

    In this example, the UserService dependency of the AuthenticationService is 'promoted' from a constructor argument to a property. Now you can create a user service like this:

    var a = new AuthenticationService();
    var s = new UserService(a);
    a.UserService = s;
    

    Breaking the circular dependency can be done with property injection and any dependency injection framework can be configured to allow property injection.

    0 讨论(0)
提交回复
热议问题