我正在设计一个运输应用程序,并尝试使用Clean Architecture和DDD。在域层的核心深处,我们有许多可配置的业务规则。例如,有一些业务规则用于确定货运的最佳承运人,确定运输方式,确定付款类型等。每个业务规则都会从数据库中选择数据,因此我打算使用BizRule存储库。问题是,根据我对DDD原理的理解,域实体(例如,货件)不应调用存储库(例如,BizRuleRepository)。用例层应该是调用存储库的那一层。如果我采用这种方法,那么我将不得不将许多复杂的业务规则移至用例层,我不确定这是否是最佳方法。在这种情况下,设置例外并让域实体调用存储库是否有意义?先感谢您。
谁应该编排/映射来自 ui 的数据?例如,登录时,我有username:password1.
) 我应该接受演示者上的LoginParamas参数,然后从 UI 中创建对象然后提供它吗?或者LoginParam
public class LoginPresenter {
public void login(LoginParam loginParam) { //pass the parameter from ui
loginUseCase.execute(loginParam)
....
}
}
Run Code Online (Sandbox Code Playgroud)
2.) 只要接受,username然后password就会presenter创建LoginParam要传递的use case?或者
public class LoginPresenter {
public void login(String username, String password) {
//create the object in the presenter
loginUseCase.execute(LoginParam.create(username, password))
}
}
Run Code Online (Sandbox Code Playgroud)
3.) 最后,将username和passwordfrom传递给presenter,usecase然后将为API 调用 …
我正在尝试将 Room 与 RxJava 和 Retrofit 结合使用,在您建议使用组件拱门之前(在这种情况下不可能,该项目已完成 50%,只需继续清理拱门)。
所以问题是这样的。我有一个返回POJO 的网络服务。像这样的东西:
{
"success":"true",
"message":"message",
"data":{[
"id":"id",
"name":"name",
"lname":"lname",
]}
}
Run Code Online (Sandbox Code Playgroud)
POJO 更复杂,但对于这个例子来说这是可以的。我需要这样做,因为我的视图进行查询以从房间调用数据,但如果我的数据库中没有数据,则调用我的 Web 服务,我的 Web 服务的响应将转换为实体并保存在我的数据库(房间)中并在返回后我的观点的数据列表。
我正在使用干净的拱门。我很感激任何帮助。再次不尝试使用
数据布局
领域
推介会
POJO API 响应
{
"success":"true",
"message":"message",
"data":{[
"id":"id",
"name":"name",
"address":"address",
"phone":"phone",
]}
}
Run Code Online (Sandbox Code Playgroud)
我的数据库实体
@Entity(tableName = "clients")
public class clients {
String id;
String name;
String address;
String phone;
String status;
public String getId() {
return id;
}
public void …Run Code Online (Sandbox Code Playgroud) 创建请求模型对象并将其传递给交互器的基本原理是什么?
为什么不将数据作为参数传入并跳过分配?对我来说,这似乎是一个非常短暂的对象。
我错过了什么?
我是flutter的初学者,学习flutter已经有6个月左右的时间了。我目前正在开发费用管理应用程序。我发现干净的架构模式非常有趣,尽管它需要比其他方式更多(!)的编码。我可以真实地说出这一点,因为我几乎制作了一个功能性应用程序,现在尝试从头开始使用干净的架构。我并不完全遵循https://pub.dev/packages/flutter_clean_architecture中的指南,而是尝试遵循干净的概念 - 域 -> 数据 -> UI
这是我到目前为止所做的:
领域
abstract class UserTransactionEntity {
final int? transactionID;
final String merchant;
final amount;
final String category;
final String paymentType;
final String paymentAccount;
final String transactionDate;
final String? transactionNotes;
final String transactionType;
///User Transaction Entity Class
UserTransactionEntity(
{required this.transactionType,
required this.merchant,
this.amount,
required this.category,
required this.paymentType,
required this.paymentAccount,
required this.transactionDate,
this.transactionNotes,
this.transactionID});
}
Run Code Online (Sandbox Code Playgroud)
///UserTransaction Interface
abstract class UserTransactionRepository {
Future<List<UserTransactionEntity>> getTransactionList();
postTransaction(UserTransactionEntity transaction);
}
Run Code Online (Sandbox Code Playgroud)
基本用例
abstract class UseCase<Type, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个旅游规划器。始终Tour在相同的坐标处开始和结束。开始和结束之间有Stops。停靠站包含旅行期间的具体Sight参观地点 + 参观时间。将景点添加到游览时,我插入一个新的停靠点,并根据停靠点之间的距离重新计算停靠点的到达时间。为此,我ITravelService在private recalculateStopTimes(int fromIdx)方法中使用注入的实例。
我的问题如下:这一直有效,直到我想通过 ORM 将 Tour 对象保留在数据库中。由于私有 ITravelService,该功能将在检索后丢失。我考虑过通过 InsertSight/RemoveSight/RemoveStop 方法注入服务,但随后我需要用我创建的每个修改 Stops 的公共方法注入它。有没有更好的方法将这样的服务注入到实体中?或者我应该注射它吗?如果没有,我怎样才能获得相同的功能(重新计算停靠点)?
public interface ITravelService
{
public TimeSpan CalculateTimeBetween(Coordinates from, Coordinates to);
}
public class Tour : ITour
{
private readonly List<Stop> _stops;
private ITravelService _travelService;
public IReadOnlyList<Stop> Stops { get { return _stops; } }
public bool IsWithinLimit { get { return _stops.Last().TimeRange.From < (StartTime.TimeOfDay + Length); } }
public Tour(DateTime startTime, TimeSpan length, Coordinates start, …Run Code Online (Sandbox Code Playgroud) c# domain-driven-design entity-framework dependency-injection clean-architecture
例如我有一个方法
\nvoid process(String userId) {\n if(userId == null) throw new IlligalArgumentException("User ID is required");\n\n User user = userService.findUserById(userId);\n\n if(user == null) throw new UserNotFoundException("User with ID: "+ userId +" not found");\n \n try {\n DataResponse response = analyticsAPI.loadAnalytics(userId, user.getDob(), user.getFirstName()); \n\n //logic\n } catch(AnalyticsAPIException e) {\n //logic\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nIlligalArgumentException是未经检查的异常UserNotFoundException是未经检查的异常AnalyticsAPIException是已检查的异常我读到,最好的做法是从 try 开始该方法并以 catch 结束,而不是在一个方法中乘以 try-catch 块。
\n\n优先使用异常而不是错误代码 我们更喜欢使用异常而不是错误代码\n因为它们更加明确。在处理 try / …
我正在使用MVVM干净的架构编写应用程序。在其中一个屏幕上,我需要使用 来RecyclerView实现pagination。我要使用图书馆Paging3。
Android 开发者建议在存储库层使用PagingSource和。RemoteMediator但同时,在许多来源中,我读到数据层和领域层不应该了解有关android框架的任何信息。
但现在我必须在数据层的数据源中使用android库。这在 a 的上下文中正确吗clean architecture?
请帮我弄清楚,我不明白如何使用干净的架构实现分页。
android android-recyclerview clean-architecture android-mvvm android-paging-3
除了可追溯性(您也可以通过 Cubit 中的适当日志记录来实现)和高级事件转换(我想不出 Cubit 无法做到的任何“高级”事件转换,因为总有办法做到这一点)使用 Cubit。如果您使用干净的架构,域/数据层可以帮助进行复杂的数据操作)。
这些是我正在寻找的应该能够用 Bloc 完成的事情,因为这些事情实际上不能用 Cubit 完成。然而,这些似乎是不可能的(或者是吗?),因为在 Bloc 上添加事件需要您识别将添加事件的实际 Bloc。bloc.add(YourEvent())。
此外,事件共享有些争议,因为这可能会导致糟糕的架构/难以维护。
对于事件溯源,我无法在文档中找到这是否可能(返回到特定的过去状态?)。
我在这里错过了什么吗?
event-driven-design flutter clean-architecture bloc flutter-bloc
android ×3
architecture ×2
flutter ×2
java ×2
android-mvvm ×1
android-room ×1
bloc ×1
c# ×1
exception ×1
flutter-bloc ×1
refactoring ×1
retrofit2 ×1
rx-java2 ×1