- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个包含 3 个 dll(web.dll、businesslogic.dll 和 services.dll)的应用程序。 Web 应用实例化使用服务的业务逻辑对象。所有服务都“隐藏”在接口(interface)后面,我使用 autofac 将这些实现注入(inject)业务逻辑对象。这里没什么特别的。
我试图通过将我的服务接口(interface)公开但通过将它们设为内部来隐藏我的类型的实现来为我的应用程序创建更好的封装。使用 Autofac 自动注册,它工作得很好,除非构造函数有一些值类型参数,如连接字符串。我有 3 个备选方案,每个备选方案各有利弊,所以我想知道哪一个被认为是最好的:
用接口(interface)(例如:IMyServiceConfigurations)替换我所有的值参数,这很好用,但创建了很多 1 属性接口(interface)和实现,这些接口(interface)和实现有点混淆了构造函数
将 autofac 模块中的注册放入我的服务 dll 中。这样做,我在我不太喜欢的服务 dll 中依赖 Autofac。我更喜欢只有应用程序(网络应用程序)的根依赖于容器
使用 NamedParameter 或 TypedParameter 但为此,应用程序的根需要知道将使用的构造函数(和实现),因此封装以另一种方式被破坏。
关于如何在不将实现泄漏到服务 dll 之外的情况下实现这一点的任何想法或评论。
谢谢。
最佳答案
I'm trying to create a better encapsulation for my app by making the interfaces of my services public but hiding the implementation of my types by making them internal
考虑到封装,将类设为内部不会改变任何内容。由于您的组件依赖于抽象,因此从消费者的角度来看,封装没有区别。他们仍然不知道实现的存在。当您将实现移动到消费者不依赖的其他程序集时,这可能会被夸大。通过这种方式,实现可以保持公开,而消费者无法直接使用它。
除此之外,即使实现是公开的,它通常仍会通过将所有内容都设置为内部来保护其不变量,除了由它实现的接口(interface)公开的部分。这意味着它仍在应用封装,即使它是公开的。
在业务线应用程序中,通过内部实现通常不会获得任何好处。您的应用程序之外没有人会尝试使用这些类型。不过,这些实现有两个消费者。这些消费者是您的单元测试和应用程序的 composition root .对于他们两者来说,如果您将它们放在内部,只会让您的工作更加困难。
重新考虑公开这些类型。
关于c# - 依赖注入(inject) : should I completely hide implementation and take a dependency on the container or keep my implementation and constructor public,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324624/
我有一个返回 future 的函数,该函数取决于要解决的回调结果: Future connectSocket(String email, String password, {Function o
我正在尝试链接两个返回 Completable 的响应式调用在 android 上使用改造: val userRequest = ... val languageRequest = ... retur
我正在尝试将一些数据保存在数据库中。对于添加方法,我使用 Completable。在我保存一个实体 - 客户之后,我想保存一个天数列表,但只有在客户被保存之后。这是我现在的代码。 mDatabaseM
我是 RxJava 的新手,遇到了以下问题: 我有两个 Completable 对象来存储一些数据。我想触发第一个,然后仅在第一个成功完成后才启动第二个。对第二个 Completable 的调用应该被
我正在尝试从两个不同的文件中读取数据,一个是 csv 格式,另一个文件是 xml 数据。使用completeFuture 我正在尝试从两个文件异步读取数据。我收到类型转换错误。请让我知道我是否遵循正确
我有以下人员类别: class Person { String name; String city; public void setInfo(PersonInformation
我正在尝试这个: var notifications = $( "#notifications" ); notifications.fadeOut("slow") .complete(func
我发现 Bash shell 支持一种不同于“传统”自动完成的自动完成类型,所有可能性都列在下一行。 使用“传统的”自动完成,如果我键入 ch 然后按 Tab 键,我会得到如下信息: $ ch cha
我是 rxjava/rxkotlin/rxandroid 的初学者。 我需要按顺序处理三个不同的异步调用。问题是第一步返回 Single ,第二个Completable第三个又是Completable
默认情况下,在 TextMate 中按 Esc 会循环执行可能的补全(除了关闭对话框之外),这可能会在文档中放入不需要的字符,特别是如果您习惯于在大多数文本编辑器中使用 Esc 作为安全键的话。 (事
我知道 pull complete 在之后到达 download complete 在生命周期中,但我有兴趣了解它们之间的区别。我尝试在互联网上搜索,但找不到任何清楚解释这些差异的内容。 最佳答案 拉
以下代码似乎永远不会工作,因为组似乎没有终止,并且 takeLast() 不知道最后是什么: observableSequence .groupBy { $0.key } .map { gro
我是 ido-mode 的忠实粉丝,以至于我想用它来做 describe-function 之类的事情或 find-tag等等,而无需编写类似“我可以在 Emacs 中搜索标签的 ido-mode-s
我们什么时候应该使用 Completable.fromAction()我们什么时候应该使用 Completable.fromCallable()是否有特定的用例 从文档看来,两者都做同样的事情,很难注
我有以下gulpfile.js,我通过命令行执行gulp消息: var gulp = require('gulp'); gulp.task('message', function() { cons
我在我的 .vimrc 文件中设置了 omnifuc : setlocal omnifunc = javacomplete#complete 然后当我编辑任何文件时出现异常: E518: Unknow
我如何将 Single 链接到 Completable,以便在 Completable 完成时订阅它? repository.downloadUser() 是 Single。 根据调试,似乎此方法中的
在bash中,默认情况下,按Tab键将显示当前目录中的所有文件和目录。例如:。Cat a将显示类似aFile.txt apples.png aDirectory/的内容。如果您随后完成了a目录,它将显
在bash中,默认情况下,按Tab键将显示当前目录中的所有文件和目录。例如:。Cat a将显示类似aFile.txt apples.png aDirectory/的内容。如果您随后完成了a目录,它将显
我错过了什么?示例使用 min.js。 bundle.min.js 有更多代码,但我找不到该额外代码的描述...... https://getbootstrap.com/docs/4.0/gettin
我是一名优秀的程序员,十分优秀!