你应该注入一个接口还是它的实现?

Should you inject an interface or its implementation?

我应该注入一个接口还是它的实现?

我在教程中看到了下面的代码,我想知道为什么注入接口但将其注册为它的实现,而您可以直接注入它的实现?

SIGNINBLOC

@injectable
class SignInBloc extends Bloc<SignInEvent, SignInState> {
  final IAuthFacade _authFacade;

  SignInBloc(this._authFacade) : super(SignInState.initial());

FIREBASEAUTH

@LazySingleton(as: IAuthFacade)
class FirebaseAuthFacade implements IAuthFacade {

注入配置

gh.lazySingleton<IAuthFacade>(
      () => FirebaseAuthFacade(get<FirebaseAuth>(), get<GoogleSignIn>()));

您想将实现细节和对特定实现的依赖性分开。在不同的实现之间切换会更容易,测试时模拟接口也更容易。

例如,您可以将 GetIt 配置为使用不同的接口实现,具体取决于它是否是,例如开发环境,生产环境,测试环境等等,只要改一行,到处都变