2

我的 DAL 返回了一个 DTO。例如

public class CustomerDTO
{
    public int CustId {get; set; }
    public int CustType {get; set; }
    .
    . 
    .
    public string GetCustomerTypes{
      get {  if (CustType== 1) 
               return "Special Customer";
             else if(CustType==
}

现在我的类中有多个属性,它们没有与任何表链接,只是代表一些属性的代码,比如我可以拥有的 CustId(1='Special Customer',2='Defaulter'or 3='New Customer')。现在我需要在 DTO 上显示它们的属性。

我可以像上面所做的那样将我的业务逻辑嵌入到 SQL 语句或我的 DTO 类中。但是,对于各种列,我最终会得到很多条件逻辑。此外,如果我制作另一个 DTO,则会再次重复此条件逻辑。

如何将这个逻辑封装在我的类设计中并避免重复?

4

4 回答 4

2

如果某段逻辑重复了,你应该把它放在一个单独的方法中。该方法的位置取决于您的系统结构,但通常您有三个主要选项:

  • 将逻辑放入辅助类
  • 将逻辑放入基类
  • 将逻辑放入扩展方法中

第一个选项是最简单的,并且需要最少的修改:只需添加一个带有静态方法的类,如下所示:

static class DtoHelper {
    public static string GetCustomerType(int type) {
        ... // Custom logic goes here
    }
}

第二种方法最不灵活,因为它要求您的 DTO 继承一个公共类:

class WithCustomerType {
    private int custType;
    public string CustomerType {
        get {
            ... // Custom logic goes here
        }
    }
}
public class CustomerDTO : WithCustomerType {
    ...
}

第三个选项更灵活,因为它使用接口而不是类型:

interface IWithRawCustomerType {
    int RawCustomerType {get;}
}
static class DtoExtensions {
    public static string GetCustomerType(this IWithRawCustomerType dto) {
        int type = dto.RawCustomerType;
        ...
    }
}
class CustomerDTO : IWithRawCustomerType {
    ...
}
于 2013-02-27T11:40:38.840 回答
1

您可以使类局部化并在局部类中编写额外的逻辑。如果它对所有 DTO 都是通用的,那么您可以将额外的逻辑放在基类中,并在您为 DTO 创建的所有分部类中继承它。

至于将类型“翻译”为字符串的问题,只需定义 Enum CustomerType 并在每个值的自定义属性中设置所需的文本。这样,您将拥有的通用逻辑将是返回您在每个实体中拥有的 Type 属性的 Attribute 值。

像这样:从枚举属性获取枚举

因此,对于您的示例,我将定义一个枚举:

public enum CustomerType
{
[Tag("SpecialCustomer")]
SpecialCustomer = 1,
...
}

然后在部分类中(如果实体是生成的代码),我会将默认成员包装到一个属性中,如下所示:

public string CustomerTypeAsString
{
 get
    { 
        return GetTagValue(CustType);
    }
}
于 2013-02-27T11:35:29.410 回答
1

我将建议您将这些值放入数据库中。您可以构建单独的表,例如:

CREATE TABLE CustomerTypes (
    ID INT PRIMARY KEY IDENTITY(1, 1),
    Name VARCHAR(50) NOT NULL
)

或者您可以构建一个带有类型代码的表,例如:

CREATE TABLE ListTypes (
    ID INT PRIMARY KEY IDENTITY(1, 1),
    Name VARCHAR(50) NOT NULL,
    TypeCode CHAR(2) NOT NULL
)

无论哪种方式,当您从数据库中收集 DTO 时,加入这些表并获取该值。因此,如果您构建了一张表,它可能看起来像:

SELECT c.*, ct.Name FROM Customer c
    JOIN CustomerTypes ct ON ct.ID = c.CustType

如果您要使用带有类型代码的更通用的表,它可能如下所示:

SELECT c.*, lt.Name FROM Customer c
    JOIN ListTypes lt ON lt.ID = c.CustType AND lt.TypeCode = '01'

这种方法对您如此有效的原因是您需要字符串值,但仅用于显示目的,并且您将在未来的许多类型中需要它。此外,您已经在数据库中获取实体,所以让数据库来完成这项工作。最后,如果您想在组合框中列出这些值并让用户选择它们,您可以从数据库中绑定该组合框,而不是静态绑定。

但简而言之,这使您的应用程序更容易修改和扩展。

于 2013-02-27T11:36:11.827 回答
1

扩展方法呢

 public static  class DerivedValues
 {
     public static void ToCustomerTypes(this CustomerDTO dto)
     {
             if (dto.CustType == 1)
             dto.GetCustomerTypes = "Special Customer";
     }
 }

主要用途

var c1 = new CustomerDTO();
        c1.ToCustomerTypes();
于 2013-02-27T11:45:23.110 回答