标签: clean-architecture

域实体应该调用存储库吗?

我正在设计一个运输应用程序,并尝试使用Clean Architecture和DDD。在域层的核心深处,我们有许多可配置的业务规则。例如,有一些业务规则用于确定货运的最佳承运人,确定运输方式,确定付款类型等。每个业务规则都会从数据库中选择数据,因此我打算使用BizRule存储库。问题是,根据我对DDD原理的理解,域实体(例如,货件)不应调用存储库(例如,BizRuleRepository)。用例层应该是调用存储库的那一层。如果我采用这种方法,那么我将不得不将许多复杂的业务规则移至用例层,我​​不确定这是否是最佳方法。在这种情况下,设置例外并让域实体调用存储库是否有意义?先感谢您。

domain-driven-design ddd-repositories clean-architecture

3
推荐指数
1
解决办法
1047
查看次数

干净的架构、数据请求协调器、呈现器或用例/交互器?

谁应该编排/映射来自 ui 的数据?例如,登录时,我有usernamepassword1.

) 我应该接受演示者上的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.) 最后,将usernamepasswordfrom传递给presenterusecase然后将为API 调用 …

java android clean-architecture

3
推荐指数
1
解决办法
1230
查看次数

使用 RxJava 和 Retrofit 实施 Room

我正在尝试将 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)

android retrofit2 clean-architecture rx-java2 android-room

3
推荐指数
1
解决办法
8865
查看次数

干净的代码、干净的架构和干净的项目布局/项目结构

  • 我正在阅读 Robert C. Martin 的《干净代码》和《干净架构》,但我不明白如果我有干净的代码,我是否也有干净的架构?
  • 如果我有干净的代码和干净的架构,我是否有良好的项目结构?它们之间有什么区别?
  • 干净的代码、干净的架构和良好的项目结构,它们之间有什么关联或如何关联?
  • 如何获得良好的项目结构、干净的架构和干净的代码?

project-layout clean-architecture

3
推荐指数
1
解决办法
5372
查看次数

为什么要有请求模型?

创建请求模型对象并将其传递给交互器的基本原理是什么?

为什么不将数据作为参数传入并跳过分配?对我来说,这似乎是一个非常短暂的对象。

我错过了什么?

clean-architecture

3
推荐指数
1
解决办法
634
查看次数

Flutter Clean 架构 - 与领域实体和数据模型的冲突

我是flutter的初学者,学习flutter已经有6个月左右的时间了。我目前正在开发费用管理应用程序。我发现干净的架构模式非常有趣,尽管它需要比其他方式更多(!)的编码。我可以真实地说出这一点,因为我几乎制作了一个功能性应用程序,现在尝试从头开始使用干净的架构。我并不完全遵循https://pub.dev/packages/flutter_clean_architecture中的指南,而是尝试遵循干净的概念 - 域 -> 数据 -> UI

这是我到目前为止所做的:

领域

  1. 在域内创建实体。让我尝试将问题与其中一个实体(用户事务)隔离开来
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)
  1. 创建了域存储库(界面?)
///UserTransaction Interface
abstract class UserTransactionRepository {
  Future<List<UserTransactionEntity>> getTransactionList();
  postTransaction(UserTransactionEntity transaction);
}

Run Code Online (Sandbox Code Playgroud)
  1. 在域中创建单独的用例

基本用例

abstract class UseCase<Type, …
Run Code Online (Sandbox Code Playgroud)

architecture flutter clean-architecture

3
推荐指数
1
解决办法
6698
查看次数

如何向域实体注入服务以及如何持久化实体

我正在创建一个旅游规划器。始终Tour在相同的坐标处开始和结束。开始和结束之间有Stops。停靠站包含旅行期间的具体Sight参观地点 + 参观时间。将景点添加到游览时,我插入一个新的停靠点,并根据停靠点之间的距离重新计算停靠点的到达时间。为此,我ITravelServiceprivate 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

3
推荐指数
1
解决办法
1986
查看次数

如何遵循鲍勃叔叔的规则(建议)在一种方法中正确使用一个 try-catch 块?

例如我有一个方法

\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. IlligalArgumentException未经检查的异常
  2. \n
  3. UserNotFoundException未经检查的异常
  4. \n
  5. AnalyticsAPIException已检查的异常
  6. \n
\n

我读到,最好的做法是从 try 开始该方法并以 catch 结束,而不是在一个方法中乘以 try-catch 块。

\n
\n

优先使用异常而不是错误代码 我们更喜欢使用异常而不是错误代码\n因为它们更加明确。在处理 try / …

java architecture refactoring exception clean-architecture

3
推荐指数
1
解决办法
868
查看次数

安卓。如何使用干净架构的分页?

我正在使用MVVM干净的架构编写应用程序。在其中一个屏幕上,我需要使用 来RecyclerView实现pagination。我要使用图书馆Paging3

Android 开发者建议在存储库层使用PagingSource和。RemoteMediator但同时,在许多来源中,我读到数据层和领域层不应该了解有关android框架的任何信息。

但现在我必须在数据层的数据源中使用android库。这在 a 的上下文中正确吗clean architecture

请帮我弄清楚,我不明白如何使用干净的架构实现分页。

android android-recyclerview clean-architecture android-mvvm android-paging-3

3
推荐指数
1
解决办法
1475
查看次数

Flutter BLoC - Bloc 与 Cubit 事件驱动的状态管理优势

Bloc 相对于 Cubit 的实际优势是什么?

除了可追溯性(您也可以通过 Cubit 中的适当日志记录来实现)和高级事件转换(我想不出 Cubit 无法做到的任何“高级”事件转换,因为总有办法做到这一点)使用 Cubit。如果您使用干净的架构,域/数据层可以帮助进行复杂的数据操作)。

分享和采购活动

这些是我正在寻找的应该能够用 Bloc 完成的事情,因为这些事情实际上不能用 Cubit 完成。然而,这些似乎是不可能的(或者是吗?),因为在 Bloc 上添加事件需要您识别将添加事件的实际 Bloc。bloc.add(YourEvent())

此外,事件共享有些争议,因为这可能会导致糟糕的架构/难以维护。

对于事件溯源,我无法在文档中找到这是否可能(返回到特定的过去状态?)。

我在这里错过了什么吗?

event-driven-design flutter clean-architecture bloc flutter-bloc

3
推荐指数
1
解决办法
1448
查看次数