You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确筛选现有类并创建独立的SalesReps类?

如何正确筛选现有类并创建独立的SalesReps类?

看起来你想要的是一个专门封装销售代表数据的类,既能筛选出符合条件(RoleId=2且用户活跃)的用户,又能作为其他类的属性来使用。咱们先看看你当前代码里的几个小问题,再一步步重构出更合理的实现:

先说说现有代码的问题

  • _salesRepData是静态只读字段,在构造函数里赋值会直接报错,而且静态字段会被所有SalesReps实例共享,完全不符合你“独立类”的需求
  • GetSalesRepList里的逻辑有问题:_userRole是单个UserRole对象,根本不能调用Find方法;而且List.Add()是void类型,不能直接作为返回值
  • SalesRepData的构造参数太繁琐,其实可以直接从User和UserRole对象映射过来,不用手动传一堆参数

重构后的代码实现

第一步:简化SalesRepData的创建

咱们给SalesRepData加一个静态方法,直接从User和UserRole生成实例,避免重复写构造参数:

public class SalesRepData
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Division { get; set; }
    public int IsActive { get; set; }

    // 从User和UserRole直接生成SalesRepData
    public static SalesRepData FromUser(User user, UserRole userRole)
    {
        return new SalesRepData
        {
            Id = user.Id,
            UserName = user.UserName,
            IsActive = user.IsActive,
            // 如果Division有固定来源,比如用户的其他属性,在这里赋值就行
            Division = string.Empty 
        };
    }
}

第二步:重构SalesReps类

让SalesReps持有自己的销售代表列表,用静态工厂方法来封装筛选逻辑,这样每个实例都是独立的,也能方便地作为其他类的属性:

public class SalesReps
{
    // 对外暴露只读的销售代表列表,避免外部随意修改
    public List<SalesRepData> Reps { get; }

    // 私有构造函数,只能通过静态工厂方法创建实例
    private SalesReps(List<SalesRepData> reps)
    {
        Reps = reps;
    }

    // 静态方法:传入所有用户角色集合,筛选出符合条件的销售代表
    public static SalesReps CreateFromUserRoles(IEnumerable<UserRole> allUserRoles, int roleId = 2, int isActive = 1)
    {
        // 筛选RoleId匹配且用户活跃的记录,然后转成SalesRepData列表
        var filteredReps = allUserRoles
            .Where(ur => ur.RoleId == roleId && ur.User.IsActive == isActive)
            .Select(ur => SalesRepData.FromUser(ur.User, ur))
            .ToList();

        return new SalesReps(filteredReps);
    }

    // 如果需要返回列表副本(防止外部修改内部集合),可以加这个方法
    public List<SalesRepData> GetSalesRepList()
    {
        return Reps.ToList();
    }
}

怎么使用这个重构后的类?

1. 创建SalesReps实例

首先你需要有所有UserRole的集合(比如从数据库查询出来的),然后用静态方法创建实例:

// 假设这是从数据库获取的所有用户角色关系
var allUserRoles = GetAllUserRolesFromDatabase();

// 创建销售代表实例
var salesReps = SalesReps.CreateFromUserRoles(allUserRoles);

// 直接访问列表
var repsList = salesReps.Reps;

2. 作为其他类的属性

现在你可以直接把SalesReps作为属性放在其他类里,完全符合你的需求:

public class OrderManagement
{
    public SalesReps SalesRep { get; set; }

    // 在构造函数里初始化销售代表属性
    public OrderManagement(IEnumerable<UserRole> allUserRoles)
    {
        SalesRep = SalesReps.CreateFromUserRoles(allUserRoles);
    }
}

为什么这样更合理?

  • 每个SalesReps实例都有自己独立的销售代表列表,完全满足“独立类”的要求
  • 筛选逻辑封装在静态工厂方法里,代码更清晰,后续要修改筛选条件(比如改RoleId或者活跃状态)只需要改这一个地方
  • Reps属性是只读的,外部不能直接修改内部集合,保证了数据的一致性
  • 用FromUser方法映射数据,避免了重复的构造参数,维护起来更方便

备注:内容来源于stack exchange,提问作者mustafa00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 09:15:32