我正在构建一个Web应用程序,我想扩展到许多用户.此外,我需要通过Web服务将功能公开给受信任的第三方.
我使用LLBLGen生成数据访问层(使用sql Server 2008).目标是构建一个业务逻辑层,屏蔽Web应用程序与DAL的细节,当然,提供超出DAL的额外级别的验证.此外,就我现在可以看出,Web服务本质上是BLL的薄薄包装.
DAL当然有自己的一组实体对象,例如CustomerEntity,ProductEntity等等.但是,我不希望表示层直接访问这些对象,因为它们包含DAL特定的方法,而程序集特定于DAL等等.所以,这个想法是创建数据传输对象(DTO).这个想法是,这些将基本上是具有所有字段的简单的旧C#/ .NET对象,例如,一个CustomerEntity,实际上是数据库表Customer,但没有其他的东西,除了可能有一些IsChanged / IsDirty属性.所以,会有CustomerDTO,ProductDTO等.我认为这些将继承自一个基础的DTO类.我相信我可以用LLBLGen的一些模板生成这些,但是我还不确定.
所以,想法是BLL将通过接受并返回这些DTO对象来公开其功能.我认为Web服务将处理将这些对象转换为使用它的第三方的XML,许多可能不会使用.NET(也有一些事情将使用JSON从Web应用程序的AJAX调用中调用脚本).
我不知道最好的方法来设计这个,以及如何前进.这里有一些问题:
1)应该如何暴露给客户端(表示层和Web服务代码)
InsertDTO,UpdateDTO,DeleteDTO,GetProducts,GetProductByCustomer等等…
这是一个好的可行方法吗?
2)从这些方法返回什么?显然,Get / Fetch方法将返回DTO.但插播呢?部分签名可以是:
InsertDTO(DTO dto)
但是,当插入什么应该返回的时候?我想通知错误.但是,我对某些表使用自动增量主键(但是,有几个表具有自然键,特别是多对多的表).
我想到的一个选择是一个Result类:
class Result { public Exception Error {get; set;} public DTO AffectedObject {get; set;} }
所以,在插入,DTO将得到其获取ID(如CustomerDTO.CustomerID)属性集,然后放入此结果对象.如果Result.Error!= null,则客户端将知道是否存在错误,然后它将从Result.AffectedObject属性中知道该ID.
这是一个好办法吗?一个问题是,它似乎是传递了大量的数据来回是冗余的(当它只是ID).我不认为添加“int NewID”属性将是干净的,因为一些插入不会有这样的自动增量密钥.另一个问题是我不认为Web服务会处理好?我相信他们只会在Result类中返回AffectedObject的基础DTO,而不是派生DTO.我想我可以通过拥有大量不同种类的Result对象来解决这个问题(可能来自基本Result并继承Error属性),但是看起来不是很干净.
好的,我希望这不是太冗长,但我想要清楚.