dependency-injection - 合理使用依赖注入
问题描述
是否有合理的方式(方法)如何在项目中使用 DI/IoC?根据 DI 概念,所有依赖项都应该是可注入的(在我的例子中,我决定使用构造函数进行注入)。问题是我应该在所有地方和所有课程中使用 DI 吗?不要让我的项目(支持)更复杂?
我将用dart
编程语言编写示例。例如,在我的项目中,我需要一些应用程序全局实例(如 SharedPrefences、DatabaseProvider 等)、一些 BLoC/控制器(如 AuthBloc、TeachersBloc、StudentBloc 等)。向用户显示数据的小部件(TeachersPage、StudentsPage 等)。
根据 DI 我需要使用此代码(示例):
合同
abstract class AuthProvider {}
abstract class DatabaseProvider {}
abstract class BlocProvider {}
具体实例(可能被替换)
class FirestoreAuthProvider implements AuthProvider {
// Implement auth functionality
}
class FirestoreProvider implements DatabaseProvider {
// Implement Firestore functionality
}
class AuthBloc implements BlocProvider {
AuthBloc(this.authProvider);
final AuthProvider authProvider;
void signIn() {
authProvider.signIn(); // use of injection.
}
}
class StudentsBloc implements BlocProvider {
StudentsBloc(this.dataProvider);
final DataProvider dataProvider;
List<Student> getStudents() {
return dataProvider.fetchAll(); // use of injection
}
}
DI组件
// Simple implementation of Dagger container
class AppContainer implements ... {
DataProvider get dataProvider => ...;
AuthProvider get authProvider => ...;
// Other injections belog
// ...
static Future<Container> create([List<AppModule> modules]) {
}
}
图形用户界面
class SignIn extends StatefulWidget {
SignIn(this.auth);
final AuthBloc auth;
void onSignedIn() {
final component = get<AppComponent>(); // get somehow AppComponent (maybe from service locator)
final dataProvider = component.dataProvider; // get globally shared component
final studentBloc = StudentsBloc(dataProvider); // inject data provider to prepare next injection
final page = StudentsPage(studentBloc); // inject the injection
Navigator.of(context).push(MaterialPageRoute(builder: (_) => page));
}
}
class StudentsPage extends StatefulWidget {
StudentsPage(this.bloc);
final StudentsBloc bloc;
}
对我来说,这变得太复杂了。是的,我知道我可以dataProvider
轻松更换,也许studentBloc
也可以更换?但是......是否有任何边界线可以证明使用 DI 是合理的?
解决方案
推荐阅读
- java - 将 Json 占位符文件映射到 java 对象
- php - VSCodium (VSCode) 不开始调试 PHP (PHP Debug + Xdebug, Linux)
- firebase - 未处理的异常:NoSuchMethodError:在 null 上调用了方法“addAdvogado”。颤振
- java - 将播放器名称添加到 Arraylist
- graphql - 阿波罗节点服务器;编写插件时如何在请求上下文中获取突变/查询模式路径?
- git-bash - git-bash if else 在某些情况下失败
- java - Java邮件是否有更好的阅读电子邮件的方法?
- php - PHP数组返回整个部分
- electron - 电子公证问题未签署所有二进制文件
- ios - 向 ScrollView 注入一个按钮