如何正确筛选现有类并创建独立的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
相关产品推荐
相关产品推荐

