标签: clean-architecture

干净的架构,用例依赖

最近,我找到了鲍勃叔叔的The Clean Architecture帖子。但是当我尝试将它应用到当前项目时,当一个用例需要依赖另一个用例时,我陷入了困境。

例如,我的领域模型是目标和任务。一个目标可以有多个任务。当我更新一个 Task 时,它需要更新其父 Goal 的信息。换句话说,用UpdateTask例将用UpdateGoal例作为依赖项。我不确定这是否可以接受,或者我们是否应该避免用例级别的依赖关系。

clean-architecture

8
推荐指数
1
解决办法
1905
查看次数

清洁架构:为不同的数据源使用不同的模型类?

我目前正在开发一个新闻提要Android应用程序.我尝试按照干净的架构原则设计我的应用程序.

在数据层中,我使用存储库模式作为不同数据源的外观:来自API的远程数据(https://newsapi.org/),来自DB(Realm或SQLite)的本地数据以及一些-memory缓存.
在我的域层中,我定义了一些不可变的模型类(Article,NewsSource等),它们由域层和表示层使用(在我看来,表示层中不需要额外的模型类).

为远程数据源和本地数据源使用不同的模型类是否有意义?

例如,远程数据源使用Retrofit进行API调用,并且需要对模型进行注释以便由GSON进行解析.

data class RemoteArticleModel(
        @SerializedName("title") val title: String,
        @SerializedName("urlToImage") val urlToImage: String,
        @SerializedName("url") val url: String)
Run Code Online (Sandbox Code Playgroud)

本地数据源的模型也可能必须满足某些特定合同,例如Realm DB中的模型需要扩展RealmObject.

open class Dog : RealmObject() {
    var name: String? = null
    @LinkingObjects("dog")
    val owners: RealmResults<Person>? = null
}
Run Code Online (Sandbox Code Playgroud)

显然,我不希望我的域模型被任何特定于数据源的契约(注释,RealmObject继承等)"污染".所以我认为为不同的数据源使用不同的模型是有意义的,并且存储库处理它们之间的映射.

例如,我们希望从远程API获取所有文章,将它们存储在本地数据库中并将它们返回到域层.

流程就像: 远程数据源向新闻api发出http请求并检索一个列表RemoteArticleModel.存储库会将这些模型映射到特定于域的文章模型(Article).然后将这些映射到DB模型(例如RealmArticleModel)并插入到DB中.最后,列表Article将返回给调用者.

出现两个问题: 上面的例子显示了使用这种方法会有多少分配.对于要下载并插入数据库的每篇文章,将在该过程中创建三个模型.那会有点矫枉过正吗?

另外,我知道数据层应该使用与域层不同的模型类(内层应该没有关于外层的任何内容).但是在上面的例子中,这有什么意义呢?我已经有两个不同的模型类用于两个不同的数据源.添加第三个被数据层/存储库用作"中介"模型以处理到其他模型(远程,本地,域)的映射将添加更多的分配.

那么,数据层是否应该对域模型一无所知,让域从数据层模型到域层模型进行映射?

应该只有存储库/数据层使用的通用模型吗?

谢谢,非常感谢更有经验的开发人员的帮助:)

android repository-pattern kotlin clean-architecture

8
推荐指数
1
解决办法
1495
查看次数

干净架构中的记录器

我正在尝试在我的 PHP 应用程序中应用清洁架构。目前我有我的业务逻辑实体User和服务UsersServiceUsersService收集与用户实体相关的所有用例。

UsersService->createUser(someData)获取用户存储库并将其存储在数据库中。

createUser在控制器和 Cli 任务中调用用例。我想在我的项目中集成日志系统。我想在用例和控制器/任务内部记录一些内容。

我需要在哪里放置Loggers factory/Logger接口?

php architecture design-patterns clean-architecture

8
推荐指数
1
解决办法
7320
查看次数

使用 Clean Architecture 从 ApplicationCore 库中的实体引用 Infrastructure 库中的 ApplicationUser

我正在按照Microsoft 架构指南创建 ASP.NET Core Web 应用程序。

该指南实现了非常简单的简洁架构模式。

如果您查看使用干净架构模式的示例项目,您将看到有一个包含 ApplicationUser.cs 类的Infrastructure/Identity文件夹。

我的问题:
我正在使用实体框架,ApplicationCore 类库中的一个业务实体需要包含一个 ApplicationUser 列表。ApplicationCore 库不应引用任何其他项目。它包含所有接口和业务实体。如何在我的基础设施/身份项目中保留 ApplicationUser 类,并且在不违反规则的情况下仍然在 ApplicationCore 项目中的业务实体之一中使用它。

我知道一种解决方案是不在我的基础设施项目中存储 ApplicationUser 实体。但是,我觉得它应该在那里,因为它在实现 IdentityUser 时将始终依赖于 Identity。

c# entity-framework-core asp.net-core-mvc asp.net-core clean-architecture

8
推荐指数
1
解决办法
1764
查看次数

如何在模块化Android应用程序中共享依赖项

我有一个以模块化方式构建的Android项目.我按照干净的架构,通过在多个Gradle模块之间划分源代码来模块化项目.

这是App的结构.

在此输入图像描述

此层次结构中的顶层模块App是其他模块所不依赖的模块,是应用程序的主要模块.下级模块domaindata不依赖于上App模块,其中所述App模块包括datadomain模块.我在app模块的build.gradle中添加了以下代码

    implementation project(':domain')
    api project(':data')
Run Code Online (Sandbox Code Playgroud)

现在,我在维护每个模块的依赖关系时遇到了一些问题.由于它们中的每一个都是一个单独的android模块,因此每个模块都有自己的模块build.gradle.该App模块可以使用datadomain模块中的类.但是,我有一些通用的类,(例如一些注释,实用程序,广播类,Dagger范围等),我想在所有模块中使用它们.但这些是我面临的问题

  • 由于这些类都包含在主模块中app,我不能在我访问这些datadomain,因为这些模块不依赖于更高层app
  • 我在所有层中使用的任何库(例如:RxJava)都需要包含在build.gradle每个模块中

作为解决方案,我想添加一个更多的android模块,比如common哪个将包含我所有的通用类以及我在所有模块中使用的库.

我的所有其它模块app,domain以及data将具有该模块作为一个依赖.

implementation project(':common')
Run Code Online (Sandbox Code Playgroud)

因此,任何全局库和类都将添加到此模块中,并且每个单独的模块将只具有特定于模块的类.

这是一个好方法吗?或者有没有办法有效地解决这个问题?

java android android-gradle-plugin clean-architecture android-architecture

8
推荐指数
1
解决办法
677
查看次数

我应该把我的DTO放在干净的架构中?

在此输入图像描述

需要实施清洁架构并与DTO概念斗争.据我所知,我不能在表示层(asp mvc)中使用我的域对象,而应该使用DTO或viewmodel.我不确定这些DTO应该去哪里.我有两个项目作为我的核心层(域,应用程序).​​Domain保存我的实体ex:'Post'+ Repository interfaces ex:'IPostRepository'.应用程序保存逻辑ex:'IPostManager'+'PostManager'.DTO和DTO映射到实体的位置应该在哪里?Asp MVC,应用程序还是域名?

c# automapper clean-architecture

8
推荐指数
2
解决办法
767
查看次数

如何在微服务中使用 Clean Architecture?

我刚读完鲍勃叔叔的“清洁架构”,现在想知道如何在微服务的上下文中应用它!

一方面,我认为微服务属于“框架驱动程序”层,因为它是用例之上的实现(它们是为用例提供服务的方式。)这样,我们专注于应用程序的核心(实体和用例),并在外层(包括微服务)的实现中保持灵活性。但是由于每个微服务都可以由不同的开发人员/开发团队维护,因此当用例发生变化时,他们会遇到困难(更难预测谁会受到影响)。

另一方面,我们可以将我们的应用拆分为多个微服务,相互解耦,并在每个微服务中应用 Clean Architecture。这种方法的优点是我们可以专注于每个微服务做一件事,并把它做好。但问题是我们开始使用技术分离(微服务)进行设计,这违反了专注于业务的主要清洁架构原则。此外,如果两个微服务使用相同的实体或用例,则很难不重复代码!

我认为第一个场景是最好的,但我想从其他开发人员那里得到关于这两个场景的长期好处和潜在问题的反馈。

microservices clean-architecture

8
推荐指数
3
解决办法
3814
查看次数

Flutter 中的简洁架构和用户登录 - 如何存储用户信息?

我一直在尝试使用Reso Coder 的 Flutter对 Uncle Bob 的 Clean Architecture 的改编。

我的应用程序连接到 API,大多数请求(登录除外)都需要身份验证令牌。此外,登录后,会收到用户个人资料信息(如姓名和个人资料图片)。

我需要一种方法来在登录时保存这些数据,并在未来的 API 请求和我的应用程序的 UI 中使用它。

由于我是鲍勃叔叔的干净架构的新手,我不太确定这些数据属于哪里。以下是我提出的想法,所有这些都涉及将数据存储在User对象中:

  1. 将其存储User在存储库层的authentication功能目录中。其他存储库级别的方法可以将其传递给适当的数据源方法。

    这似乎是最有道理的;调用其他 API 调用的其他存储库级方法可以User轻松使用存储的内容,将其传递给数据源层中的方法。

    如果这是要走的路,我不太确定其他功能(使用 API)将如何访问User- 让一个存储库依赖于另一个存储库并将authentication存储库传递到新功能存储库可以吗?

  2. 将其存储User在存储库层的authentication功能目录中。其他(非登录)用例可以依赖于该存储库以及与其自身功能相关的存储库,并将其传递User给其存储库方法。

    这也打破了垂直功能障碍,但它可能比想法 1 更清晰。

对于这两个想法,我的存储库如下所示:

abstract class AuthenticationRepository {
  /// The current user.
  User get currentUser;

  /// True if logged in.
  bool get loggedIn;

  /// Logs in, saving the [User].
  Future<void> login(AuthenticationParams params);

  /// Logs …
Run Code Online (Sandbox Code Playgroud)

architecture authentication state flutter clean-architecture

7
推荐指数
1
解决办法
2009
查看次数

Hilt 如何在遵循 CLEAN 架构原则的多模块应用程序中有效使用?

我正在按照 Clean Architecture 原则构建一个 Android 应用程序。这是我所拥有的:

应用模块

  • 包含所有 Android 依赖项。
  • 将 MVVM 与来自 arch 组件的 ViewModel 一起使用。
  • ViewModels 只与 UseCases 通信,它们是构造函数注入的。

用例模块

  • 包含所有用例。
  • 用例仅与存储库通信,存储库是构造函数注入的。

存储库模块

  • 包含所有存储库。
  • 存储库与 Web 服务或数据库等进行通信。
  • 我在这一层定义了一个 Retrofit 接口,存储库在它的构造函数中接受它。

数据模块

  • 包含所有数据模型

我正在尝试在应用程序中使用 Hilt 进行依赖注入。我不想将 Retrofit、OkHttp 等暴露给 app 模块,因为我不希望开发人员能够将网络代码放在错误的模块中。请记住,应用程序模块使用只能与用例对话的 ViewModel。

我该如何设置?我尝试将 dagger 模块放在每个模块中来定义注入,然后在主应用程序模块中我包含了用例中的模块:

@Module(includes = [UseCaseModule::class])
@InstallIn(ApplicationComponent::class)
object AppModule
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它开始抱怨无法在我想隐藏的其他模块中找到传递依赖项。

android dependency-injection solid-principles clean-architecture dagger-hilt

7
推荐指数
1
解决办法
2087
查看次数

访问和使用 Clean Architecture 中其他功能的实体

我已经为应用程序的每个部分创建了功能包,我的项目结构如下所示:

\n
app\n    core\n    features\n        main\n            domain\n            data\n            ui\n        feature1\n            domain\n                entities\n                    entity1\n                    entity2\n                \xe2\x80\xa6\n            data\n            ui\n        feature2\n            domain\n                entities\n                    entity1\n                    entity2\n                \xe2\x80\xa6\n            data\n            ui\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是我可以在我的主要功能中使用feature1feature2实体吗?如果这不是正确的方法,有没有更好的解决方案?\n谢谢大家。

\n

architecture entity flutter clean-architecture

7
推荐指数
2
解决办法
1997
查看次数