c# – 如何在业务逻辑层中设计数据传输对象

前端之家收集整理的这篇文章主要介绍了c# – 如何在业务逻辑层中设计数据传输对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
DTO

我正在构建一个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#相关文章