- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前的项目中有相当多的类,并且每个类都实现一个接口(interface),主要是出于 DI 的原因。
现在,我个人的感觉是,这些接口(interface)应该放入同一程序集中的单独命名空间中(因此我们有一个 MyCompany.CoolApp.DataAccess
程序集,其中有一个 Interfaces
命名空间提供 MyCompany.CoolApp.DataAccess.Interfaces
)。
但是,有人建议这些接口(interface)实际上应该位于它们自己的程序集中。我的问题是——他们是对的吗?我可以看到有一些好处(例如,其他项目只需要使用接口(interface)程序集),但最终所有这些程序集都需要加载。在我看来,可能存在稍微复杂的部署问题,因为 Visual Studio 不会自动将实现程序集拉入目标的 bin 文件夹中。
是否有这方面的最佳实践指南?
编辑:
为了让我的观点更清楚一点:我们已经将 UI、DataAccess、DataModel 和其他东西分离到不同的程序集中。目前,我们还可以轻松地将我们的实现替换为不同的实现,因为我们使用 Unity(IOC 框架)将实现类映射到接口(interface)。我应该指出,除了出于多态性和为单元测试创建模拟的原因之外,我们永远不会编写同一接口(interface)的两个实现。因此,除了单元测试之外,我们目前不会“交换”实现。
我认为将接口(interface)与实现放在同一程序集中的唯一缺点是整个程序集(包括未使用的实现)都将被加载。
但是,我可以看到,将它们放在不同的程序集中意味着开发人员不会意外地“新建”实现类,而不是使用 IOC 包装器创建它。
我从答案中没有理解的一点是部署问题。如果我只依赖于接口(interface)组件,我将拥有类似以下结构的内容:
MyCompany.MyApplication.WebUI
References:
MyCompany.MyApplication.Controllers.Interfaces
MyCompany.MyApplication.Bindings.Interfaces
etc...
当我构建这个时,自动放入 bin 文件夹的程序集只是那些接口(interface)程序集。然而,我在统一中的类型映射将不同的接口(interface)映射到它们的实际实现。包含我的实现的程序集如何最终出现在 bin 文件夹中?
最佳答案
通常
预期?实践是将它们放在自己的程序集中,因为这样使用这些接口(interface)的给定项目不需要对实现的硬引用那些接口(interface)。从理论上讲,这意味着您可以轻松地更换实现。
也就是说,我不记得上次这样做是什么时候,就 @David_001 的观点而言,这不一定是“通常的”。我们倾向于让我们的接口(interface)与实现保持一致,这是我们测试接口(interface)的最常见用途。
我认为根据您所生产的产品可以采取不同的立场。我倾向于生成 LOB 应用程序,这些应用程序需要与其他应用程序和团队进行内部互操作,因此任何给定应用程序的公共(public) API 都有一些利益相关者。然而,这并不像为许多未知的客户端生成库或框架那么极端,公共(public) API 突然变得更加重要。
在部署场景中,如果您更改了实现,理论上您可以只部署该单个 DLL - 这样就可以单独保留 UI 和接口(interface) DLL。如果您将接口(interface)和实现一起编译,则可能需要重新部署 UI DLL...
另一个好处是代码的干净隔离 - 拥有一个接口(interface)(或共享库)DLL 向开发团队中的任何成员明确指出在哪里放置新类型等。
我不再计数这是一个好处,因为我们没有遇到任何不这样做的问题,无论接口(interface)放置在哪里,仍然可以轻松找到公共(public)合约。
我不知道是否存在支持或反对的最佳实践,可以说重要的是在代码中,您始终使用接口(interface)并且永远不会让任何代码泄漏到使用实现中。
关于.net - 我应该有一个单独的接口(interface)组件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363312/
我正在尝试在Elasticsearch中返回的值中考虑地理位置的接近性。我希望近距离比某些字段(例如legal_name)重要,但比其他字段重要。 从文档看来,当前的方法是使用distance_fea
我是Elasticsearch的初学者,今天在进行“多与或”查询时遇到问题。 我有一个SQL查询,需要在Elastic中进行转换: WHERE host_id = 999 AND psh_pid =
智能指针应该/可以在函数中通过引用传递吗? 即: void foo(const std::weak_ptr& x) 最佳答案 当然你可以通过const&传递一个智能指针。 这样做也是有原因的: 如果接
我想执行与以下MYSQL查询等效的查询 SELECT http_user, http_req_method, dst dst_port count(*) as total FROM my_table
我用这两个查询进行测试 用must查询 { "size": 200, "from": 0, "query": { "bool": { "must": [ { "mat
我仍在研究 Pro Android 2 的简短服务示例(第 304 页)同样,服务示例由两个类组成:如下所示的 BackgroundService.java 和如下所示的 MainActivity.j
给定标记 like this : header really_wide_table..........................................
根据 shouldJS 上的文档网站我应该能够做到这一点: ''.should.be.empty(); ChaiJS网站没有使用 should 语法的示例,但它列出了 expect 并且上面的示例似乎
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
在 C++11 中,可变参数模板允许使用任意数量的参数和省略号运算符 ... 调用函数。允许该可变参数函数对每个参数做一些事情,即使每个参数的事情不是一样的: template void dummy(
我在我从事的项目之一上将Shoulda与Test::Unit结合使用。我遇到的问题是我最近更改了此设置: class MyModel :update end 以前,我的(通过)测试看起来像这样: c
我该如何做 or使用 chai.should 进行测试? 例如就像是 total.should.equal(4).or.equal(5) 或者 total.should.equal.any(4,5)
如果您要将存储库 B 中的更改 merge 到存储库 A 中,是否应该 merge .hgtags 中的更改? 存储库 B 可能具有 A 中没有的标签 1.01、1.02、1.03。为什么要将这些 m
我正在尝试执行X AND(y OR z)的查询 我需要获得该代理为上市代理或卖方的所有已售属性(property)。 我只用 bool(boolean) 值就可以得到9324个结果。当我添加 bool
我要离开 this教程,尝试使用 Mocha、Supertest 和 Should.js 进行测试。 我有以下基本测试来通过 PUT 创建用户接受 header 中数据的端点。 describe('U
我正在尝试为 Web 应用程序编写一些 UI 测试,但有一些复杂的问题希望您能帮助我解决。 首先,该应用程序有两种模式。其中一种模式是“训练”,另一种是“现场”。在实时模式下,数据直接从我们的数据库中
我有一个规范: require 'spec_helper' # hmm... I need to include it here because if I include it inside desc
我正在尝试用这个测试我在 Rails 中的更新操作: context "on PUT to :update" do setup do @countdown = Factory(:count
我还没有找到合适的答案: onclick="..." 中是否应该转义 &(& 符号)? (或者就此而言,在每个 HTML 属性中?) 我已经尝试在 jsFiddle 和 W3C 的验证器上运行转义和非
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Main extends Applet i
我是一名优秀的程序员,十分优秀!