问题标签 [bll]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 除了实例化 DAL 的 BLL 之外,还有什么选项允许在 n 层解决方案中进行单元测试,而不会将 DAL 暴露给 UI 或将 BLL 暴露给 DAL?
我有一个分层的解决方案如下:
- UI(用户界面)
- BLL(业务逻辑层)
- DAL(数据访问层)
- SharedEntities(仅具有实体 POCO 的 VS 项目)
我希望 BLL 有一个名为 GetProductList() 的服务,该服务在我的 DAL 层中实现。我想过在 BLL 和 DAL 实现中定义一个接口,如下所示:
选项 A:
如果我想在 DAL 中实现这一点,那么我必须让 DAL 项目引用 BLL 项目才能看到 IDataServices 的接口定义。或者,我可以在 DAL 中复制接口定义,但最终我会使用重复的代码来维护(BLL 和 DAL 中的接口定义相同)。
选项 B:我可以做到这一点的另一种方法是忘记接口的想法,只需在 UI 可以使用的 BLL 中进行以下具体的类和方法调用:
这很容易,但是 BLL 看到了 DAL 并引用了它,但这真的是一件坏事吗?只要 BLL 不使用任何数据库对象(即数据源、连接字符串等)来满足请求并且 DAL 符合匹配我在 BLL DataServices 类中定义的服务名称,这还不够吗?我听到的所有关于交换另一个数据库引擎的讨论仍然可以通过确保下一个 DAL 提供 BLL 在 DataServices 类中标识的相同服务来完成,例如 GetProductList()。在这个设置中,UI 仍然不知道任何关于 DAL 的信息,而 DAL 也不知道任何关于 BLL 的信息。如果我考虑使用依赖注入来避免在 BLL 中实例化 DAL 的想法,那将意味着在 UI 中实例化它以传递给 BLL。
选项 C:我简要查看了 Unity Container,但该工具建议在入口点预先注册所有接口和具体类,这本来是 UI,这反过来又使 UI 对 BLL 和 DAL 可见似乎更糟。我看到了使用 MEF 和 Unity 来解决入口点看到所有层的问题的参考,但也看到如果你这样做,你就不能真正对这样的配置进行单元测试。与选项 B 相比,似乎需要大量工作和复杂性。
选项 D:我想到的另一个选项是在 BLL 和 DAL 之间创建一个外观层(另一个 VS 项目)。这似乎没有多大意义,除非我最终得到了很多与 BLL 无关的 DAL 方法,因此它们必须被隐藏;允许 DAL Facade 仅显示 BLL 需要的内容。如果我要换入另一个数据库,我仍然必须根据 BLL 的需要创建外观所需的方法,正如我在选项 B 中提到的那样。
因此,基于这一切,我正在考虑选择选项 B,但我想在这里获得一些社区意见。我还能做什么满足以下条件:
- 1) 不让 UI 看到 DAL
- 2) 不让 DAL 看到 BLL
- 3) 该解决方案仍然允许对所有层进行单元测试
c# - 如何将 Entity(EF) 和 EntityDTO 与 Contract(Interface) 一起使用
我在 DAL 中有一个由实体框架生成的实体(EF)。
我在 BLL 中创建了 UserDto
要在 DAL 和 BLL 之间传输数据,我使用的是 Contract(Interface)
在这种情况下,如何在 DAL 和 BLL 之间传输导航字段?像这样:
怎么做更好:
删除合约(接口)并将用户(EF)直接转移到BLL或建议解决此问题的解决方案。从架构的角度删除合约(接口)是否正确?
c# - 内部包含多个类的单个 DTO 类
一个关于 DTO 的简单问题,我有一个 DTO 类 Cars,里面还有其他一些汽车模型的子类。
而 Porshe 和 Mustang 是完全一样的法拉利。问题是我现在不知道如何进行。我尝试类似的东西
而且它不起作用,因为我在 cars.FerrariModel.collor ->“对象引用未设置段落 Hum 对象的实例。hum 对象声明”中收到以下错误。我必须承认我什至不知道这是“可能的”,或者我是否在“发明编程”,所以任何帮助都会非常有用。
- 为什么只使用一个类?因为需要在参数中传递单个 DTO:save(Cars car); 更新(汽车汽车)
- 使用第二个分离的类会迫使我“重载”该方法:save(Cars car); 保存(法拉利法拉利);
- 如果我使用单一课程(没有法拉利、保时捷和野马),程序可以工作,但我的 InteliSense 中有很多变量,超过 50 个。
谢谢你。
asp.net - 如何将空日期时间保存到 SqlServer DB?不工作
VS-Studio 2012 Web Express、ASP.NET、WebForms、VB、SqlServer、WebSite 应用程序无法将 DateTime 的 NULL 值保存到强类型 ROW:
目前,DetailsView 模板字段文本框为 <blank> 或空或“”,BLL 函数将其显示为日期,如:#01/01/0001#。因此,如果小于 10,我测试传入变量的 YEAR 值,然后将 DBNull.Value 保存到 oRowVehicles.[WElectrical] 但由于 datatype=Date 并且无法将 DBNull 转换为 Date 而失败。
DB 字段是 Date 类型,允许为空。
TableAdapter.xsd 视图显示默认值为 < DBNULL>。
那么,为什么 oRowVehicles 的 Date 不能为空?
如何使 WElectrical 列可以为空 DATE?
我一定忽略了一些东西,因为我不能是唯一一个将可选 DATE 值保存到 Sql-DB 的人。
欢迎您提出意见和解决方案。谢谢...约翰
在 DetailsView 中编辑 ASPX 代码一个 DATE 字段(其他类似):
ASPX 中的Object DataSource 参数定义。
BLL 代码:
编辑上述代码的注释
进入 BLL 函数的 WElectrical 参数是一个 DATE,其值为 #01/01/0001#。
将值放入 ROW 对象的代码
将 Nothing 作为行对象字段值。
Adapter.Update (odtVEHICLES)更新 Sql-DB。
那么是什么导致 #01/01/0001# 值被放入 Sql-DB 中呢?
Sql-DB 列定义
//////// 编辑结束 ///////////
wpf - MVVM & 业务逻辑层
我对 MVVM 模式和绑定集合有疑问。我的 ViewModel 为 View 提供了一个集合,但是为了获得这个集合,我使用了这个:
当我在这个列表上绑定我的视图时,就好像我直接在模型上绑定我的视图,因为它们使用相同的引用。因此,当我编辑 a 的一个属性时Car
,直接编辑模型而不使用carServices
验证方法。
纠正这个问题的最佳解决方案是什么?
我是否必须将我的模型的副本公开给我的视图才能不直接从视图中编辑我的模型?
我是否必须BindingList
在我的模型中使用并订阅ListChanged
我的carServices
才能验证每个更改?