我正在创建n层应用程序架构。不同的层不知道彼此的内部实现,层之间的通信通过非常窄的接口进行,并辅以IoC/DI。
现在我将业务对象(在业务层中定义)传递到数据层。业务层本身并不知道数据实际上是如何保存的(通常是数据库,但业务层不应该知道)。业务对象通过IDataReader的实现传递到数据层(这种方法还支持未来情况下的批量加载数据)。数据层从IDataReader中读取所有数据,并调用一些存储过程将数据保存到数据库中(如果保存一个对象,则IDataReader返回“一行”)。
实际问题在于:
因为我只是将IDataReader传递给数据层,并且将数据与其类型分离,所以在这种情况下确定数据位置的最佳方式是什么?
例如,如果我将类型为“User”的实际业务对象传递到数据层,则数据层应将数据保存到表“User”中。在某些其他情况下,数据可能会独立于业务层中的类型而保存到某个不同的结构中。
在当前实现中,我将业务对象的类型信息传递到数据层,数据层检查此类型并决定将数据放置在哪里。
数据层检查传入的数据并决定其位置是否正确,或者数据层应公开可以保存数据的“位置”列表(枚举)?
提前感谢!
澄清:
我看到的选项是: 1.数据层提供可以保存数据的“位置”列表 2.数据层检查给定的参数(如类型参数)并决定存储数据的位置
第一种选择的惩罚是什么?如果我尝试将类型为“Product”的业务对象存储到通常由类型“User”使用的结构中怎么办?
第二个选项的惩罚是什么?我必须将类型“Namespace1.Namespace2.User”映射到将其数据保存到表“User”的特定例程。因此,需要为每个类型手动执行一些映射...。
澄清2:
现在我像这样检索:
然后我有一段代码,可以将给定类型映射到属性值...但它有点臃肿,并且硬编码了类型字符串...有什么建议吗?
/澄清3
我有一个想法,这个系统可以通过“可插拔的业务模块”进行扩展。这些模块包含基本业务逻辑不知道的业务对象(和一些逻辑),而数据层完全不知道这些包含在“插入程序集”中的业务对象。这个外部业务模块没有参考基本业务层或数据层。当来自此外部程序集的业务对象被保存(=发送到数据层)时,默认情况下,数据层会将其保存为EAV样式(http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)数据结构。因为这种数据结构可能存在一些性能问题,数据层必须有一种方法来决定将特定的业务对象类型保存在它们自己的专用数据结构中(通常是具有与该类型的一对一映射的表)。所以问题出现在这里,如何实现这个“选择决策”:)
这里的想法是,我可以创建很多新的业务对象,并将它们全部保存到数据层,而不需要实际编写任何数据层代码!如果需要,稍后我可以为选定的业务对象创建自己的专用数据结构。
现在我将业务对象(在业务层中定义)传递到数据层。业务层本身并不知道数据实际上是如何保存的(通常是数据库,但业务层不应该知道)。业务对象通过IDataReader的实现传递到数据层(这种方法还支持未来情况下的批量加载数据)。数据层从IDataReader中读取所有数据,并调用一些存储过程将数据保存到数据库中(如果保存一个对象,则IDataReader返回“一行”)。
实际问题在于:
因为我只是将IDataReader传递给数据层,并且将数据与其类型分离,所以在这种情况下确定数据位置的最佳方式是什么?
例如,如果我将类型为“User”的实际业务对象传递到数据层,则数据层应将数据保存到表“User”中。在某些其他情况下,数据可能会独立于业务层中的类型而保存到某个不同的结构中。
在当前实现中,我将业务对象的类型信息传递到数据层,数据层检查此类型并决定将数据放置在哪里。
数据层检查传入的数据并决定其位置是否正确,或者数据层应公开可以保存数据的“位置”列表(枚举)?
提前感谢!
澄清:
我看到的选项是: 1.数据层提供可以保存数据的“位置”列表 2.数据层检查给定的参数(如类型参数)并决定存储数据的位置
第一种选择的惩罚是什么?如果我尝试将类型为“Product”的业务对象存储到通常由类型“User”使用的结构中怎么办?
第二个选项的惩罚是什么?我必须将类型“Namespace1.Namespace2.User”映射到将其数据保存到表“User”的特定例程。因此,需要为每个类型手动执行一些映射...。
澄清2:
现在我像这样检索:
service.Retrieve(typeof(Catalog), null, catalogArgs, e => catalogConverter.Read(e));
我将typeof(Catalog)传递到数据层...这样我在数据层就有了类型信息。
现在在数据层中,我需要选择“适配器”,以从数据库获取数据。我可以编写庞大的if/switch结构来选择适配器...这很令人沮丧。同时,我也可以编写属性并像下面这样使用:
[TypeAdapterAttribute("Namespace1.Namespace2.Catalog, and assembly info...")]
class CatalogAdapter { ... }
然后我有一段代码,可以将给定类型映射到属性值...但它有点臃肿,并且硬编码了类型字符串...有什么建议吗?
/澄清3
我有一个想法,这个系统可以通过“可插拔的业务模块”进行扩展。这些模块包含基本业务逻辑不知道的业务对象(和一些逻辑),而数据层完全不知道这些包含在“插入程序集”中的业务对象。这个外部业务模块没有参考基本业务层或数据层。当来自此外部程序集的业务对象被保存(=发送到数据层)时,默认情况下,数据层会将其保存为EAV样式(http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)数据结构。因为这种数据结构可能存在一些性能问题,数据层必须有一种方法来决定将特定的业务对象类型保存在它们自己的专用数据结构中(通常是具有与该类型的一对一映射的表)。所以问题出现在这里,如何实现这个“选择决策”:)
这里的想法是,我可以创建很多新的业务对象,并将它们全部保存到数据层,而不需要实际编写任何数据层代码!如果需要,稍后我可以为选定的业务对象创建自己的专用数据结构。
PropertyInfo[] props = obj.GetType().GetProperties();
。 - Olivier Jacot-Descombes