扩展基类以包含详细信息

本文关键字:详细信息 包含 基类 扩展 | 更新日期: 2023-09-27 18:01:17

我有一个由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='特殊客户',2='默认客户'或3='新客户')。现在我需要在DTO上显示它们的属性。

我可以像上面那样将业务逻辑嵌入到SQL语句或DTO类中。然而,对于不同的列,我最终使用了很多条件逻辑。此外,如果我再次创建DTO,则再次重复此条件逻辑。

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

扩展基类以包含详细信息

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

  • 将逻辑放入helper类
  • 将逻辑放入基类
  • 将逻辑放入扩展方法

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

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 {
    ...
}

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

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'

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

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

您可以将类设置为偏类,并在偏类中编写额外的逻辑。如果它对所有dto都是通用的,你可以把额外的逻辑放在基类中,并在你为dto创建的所有部分类中继承它。

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

从enum属性 中获取enum

所以,对于你的例子,我将定义一个enum:

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

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

public string CustomerTypeAsString
{
 get
    { 
        return GetTagValue(CustType);
    }
}

扩展方法呢

 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();