我正在构建一个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等等…
然后,客户端将调用这些方法并传递适当的参数,通常是DTO.
这是一个好的可行方法吗?
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属性),但是看起来不是很干净.
好的,我希望这不是太冗长,但我想要清楚.
解决方法 1:这是一个非常标准的方法,它适用于最佳的可单独测试方法的“存储库”实现.2:异常(在WCF边界btw中应该被声明为“故障”)会自动升高.你不需要直接处理.对于数据 – 有三种常见的方法:
>使用参考合同(不太漂亮)
>返回(更新)对象 – 即public DTO SomeOperation(DTO item);
>只返回更新的身份信息(主键/时间戳/等)
所有这些的一件事是,它不需要每个 *** 作的不同类型(与您的Result类对比,这需要根据DTO重复).
总结以上是内存溢出为你收集整理的c# – 如何在业务逻辑层中设计数据传输对象全部内容,希望文章能够帮你解决c# – 如何在业务逻辑层中设计数据传输对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)