扩展基类以包含详细信息
本文关键字:详细信息 包含 基类 扩展 | 更新日期: 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();