看似循环的依赖导致了温莎城堡的问题

本文关键字:城堡 问题 循环 依赖 | 更新日期: 2023-09-27 18:10:56

我有一个IUserService(和其他服务),我批量注册在我的ServiceInstaller.cs:

  container.Register(
                AllTypes.FromAssemblyContaining<UserService>()
                .Where(type => type.Name.EndsWith("Service"))
                .WithService.DefaultInterface()
                .Configure(c => c.LifeStyle.Singleton)
                );

然后我有IAuthenticationService,我注册为我的通用WindsorInstaller.cs文件:

  container.Register(Component.For(typeof (IAuthenticationService))
                .ImplementedBy(typeof(AuthenticationService)));

现在一切都很好,直到我在UserService中为IAuthenticationService添加了一个公共属性。

似乎有一个循环依赖或一些时间问题,当事情得到注册,因为我得到的错误:

Can't create component 'ABCD.Services.UserService' as it has dependencies to be satisfied.
ABCD.Services.UserService is waiting for the following dependencies:
Services:
- ABCD.Services.Interfaces.IAuthenticationService which was registered but is also waiting for dependencies.
ABCD.Services.AuthenticationService is waiting for the following dependencies:
Services:
- ABCD.Services.Interfaces.IUserService which was registered but is also waiting for dependencies. 

如何解决这个问题?

看似循环的依赖导致了温莎城堡的问题

您需要:

  1. 摆脱你的循环依赖(这是首选选项),或者
  2. 绕过它们,使用属性注入,而不是构造函数注入。

使用属性注入(如Steven的回答所示)允许您创建类的实例,而无需在创建时提供所有依赖项。缺点是,对于类的用户来说,他们需要做什么来实例化和完全配置实例并不是那么明显。

有关如何重构以移除循环依赖的详细说明,请参阅Miško Hevery的博客文章:

  • 构造函数中的循环依赖和依赖注入

属性注入将解决您的问题,因为它打破了依赖循环。只要看看krzysztoof的例子,并尝试实例化一个UserService;你不能。现在看一下下面的例子:

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

在这个例子中,AuthenticationServiceUserService依赖被从构造函数参数"提升"为属性。现在您可以像这样创建一个用户服务:

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

打破循环依赖可以通过属性注入来完成,任何依赖注入框架都可以配置为允许属性注入。

这是我对你的理解:

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

如何创建两个类的实例,每个类最多创建一个实例?