让我设置我的LOB场景。
我正在重写我们的核心业务应用程序。要求是我创建了一个内部可用的应用程序(我想使用Silverlight),我们的员工每天使用它。我还需要提供一个可用于输入订单,获取发票等的SOAP服务。
我也将这样做,所以当我更新新SQL Server数据库中的记录时,我还需要确保更新我们的旧SQL Server。
因此,创建一个从新SQL服务器提取数据的DAL以及写回2个数据存储肯定是有意义的。
创建一个可供Silverlight / RIA和WCF Web服务使用的BLL也是有意义的。
我在自己的项目中创建了新数据库的数据实体,并在所有其他项目中使用。这里的问题是RIA似乎要求我在ASP.Net项目中创建它以获取Silverlight的元数据。如果没有这个,我需要手动重新创建Silverlight的元数据才能正确访问它。
我的问题是,我应该创建实体模型的副本吗?一个用于RIA,一个用于其他一切?有一个更好的方法吗?我应该放弃使用RIA并让Silverlight访问WCF服务吗?或者我应该继续在RIA中复制元数据吗?
答案 0 :(得分:1)
我们使用实体直接引用存储和数据传输对象(DTO),这些对象在BLL和WCF / GUI /等之间来回传递几乎相同。我们使用AutoMapper在2之间进行映射,这意味着只有很少的额外工作,但我们不必担心给定实体是否附加到上下文/跟踪状态更改/等...
修改:您绝对希望将代码保留为DRY。就个人而言,我会考虑在BLL上面使用DTO,并且要么有两套在DAL中协调的存储库(一个RW,一个W只)。甚至还有Meta存储库来处理2个商店本身的数据集。
如果你还没有使用它,那么Unity和IoC在这里对你真正有益。您可能还想使用其中一种模块化代码模式,以允许您以不同模式注册[n]数据存储,这样当您最终想要退出旧存储时,您不需要做太多工作。
我还会质疑你的实体是否需要在ASP.Net中定义 - 你可以简单地从你的实体/ DTO项目中引用适当的DLL并添加相应的标记/配置