C# 如何控制IEnumerable上的更新
如果我有一个具有以下签名的方法:C# 如何控制IEnumerable上的更新,c#,oop,domain-driven-design,ienumerable,C#,Oop,Domain Driven Design,Ienumerable,如果我有一个具有以下签名的方法: public IEnumerable<ScheduleDetailsView> StructureSchedule() { bool isStartWeek = false; int index = -1; var week = Enum.GetValues(typeof(Week)).Cast<Week>(); var weekLength = Enum.GetNa
public IEnumerable<ScheduleDetailsView> StructureSchedule()
{
bool isStartWeek = false;
int index = -1;
var week = Enum.GetValues(typeof(Week)).Cast<Week>();
var weekLength = Enum.GetNames(typeof(Week)).Length;
List<ScheduleDetailsView> scheduleDetailsViews = new List<ScheduleDetailsView>();
for (int i = 0; i < weekLength; i++)
{
if (isStartWeek)
{
if (WorkingGroup.WeekStart == week.ElementAt(i))
{
index = i;
i = 0;
isStartWeek = false;
}
}
else
{
ScheduleDetailsView scheduleDetailsView = new ScheduleDetailsView(i, week.ElementAt((i + index) % weekLength), false, false,0);
scheduleDetailsViews.Add(scheduleDetailsView);
}
}
return scheduleDetailsViews;
}
现在,此方法的用户应该只填充此结构中的一些属性
(IsWeekend、IsShortDay、ShiftId)
,而不添加新的ScheduleDetailView或更改这些项的顺序或覆盖整个属性
IEnumerable
并将其返回给调用者
例:
这是可以接受的:
1 6 true false 1 -1
2 7 false false 2 -1
3 1 false false 3 -1
4 2 false false 4 -1
5 3 false false 5 -1
6 4 false false 6 -1
7 5 true true 7 -1
这是不允许的:因为它会改变工作日
1 5 true false 1 -1
2 7 false false 2 -1
3 1 false false 3 -1
4 2 false false 4 -1
5 3 false false 5 -1
6 4 false false 6 -1
7 6 true true 7 -1
这是不允许的:因为它从返回的IEnum中删除
1 6 true false 1 -1
2 7 false false 2 -1
3 1 false false 3 -1
4 2 false false 4 -1
5 3 false false 5 -1
6 4 false false 6 -1
如何保证此方法的用户只更新上一个结构中的(IsWeekend、IsShortDay、ShiftId)
,并在其更新版本中返回IEnumerable
定义一个接口以公开ScheduleDetailView的子集
使ScheduleDetailView
internal
,以便其他程序集不能向下转换为完整类型
使用
定义一个接口以公开ScheduleDetailView的子集
使ScheduleDetailView
internal
,以便其他程序集不能向下转换为完整类型
使用
当你想要这种分离时,你谈论的是两个子系统。至少在逻辑上,他们目前可能处于相同的过程中
要获得适当的隔离,请使用DTO(数据传输对象)。这可能是同一个类,但它需要不同的实例。消费者应返回更新的项目列表,然后仅将相关属性复制回原始项目 当你想要这种分离时,你说的是两个子系统。至少在逻辑上,他们目前可能处于相同的过程中
要获得适当的隔离,请使用DTO(数据传输对象)。这可能是同一个类,但它需要不同的实例。消费者应返回更新的项目列表,然后仅将相关属性复制回原始项目 “覆盖整个IEnumerable”是什么意思<代码>IEnumerable
不能通过其接口进行更改、重新排序等。您只能将其转换回具体类型,如List
(如果它是List)并对其进行更改,但这将违反接口i的意思是这样的:IEnumerable x=new List()
是否要创建一个即使使用强制转换也无法更改的IEnumerable
,还是只接收在StructureSchedule
内部创建的IEnumerable
,而不接收在此方法之外创建的任何内容?@arekzyla我只接收在StructureSchedule内部创建的IEnumerable,而不接收在此方法之外创建的任何对象
您所说的“覆盖整个IEnumerable”是什么意思<代码>IEnumerable不能通过其接口进行更改、重新排序等。您只能将其转换回具体类型,如List
(如果它是List)并对其进行更改,但这将违反接口i的意思是这样的:IEnumerable x=new List()
是否要创建一个即使使用强制转换也无法更改的IEnumerable
,还是只接收在StructureSchedule
内部创建的IEnumerable
,而不接收在此方法之外创建的任何内容?@arekzyla我只接收在StructureSchedule内部创建的IEnumerable,而不接收在此方法之外创建的任何exactly@AnynameDonotcare所以做一个更小的子集!这有什么问题?对于你的问题没有神奇的解决办法:你需要根据你的要求分离你的表面。@anyname不在乎,所以做一个更小的子集吧!这有什么问题?你的问题没有神奇的解决方案:你需要根据你的要求分离你的表面。你能解释更多吗?我只是公开一个视图,但我想根据我的业务规则验证返回的。例如,对象的数量为=7(一周),因此我不希望用户向列表中添加新对象。它们不是两个子系统,有域类和使用域类的mvc web应用程序,我想对mvc开发人员使用的方法进行更多控制,我称之为2个susbsystems。这里没有魔杖,在每一个门阶上验证你的数据。非常感谢,如果我打扰了你,我很抱歉,我只是想用正确的方式来做。你能解释更多吗?我只是公开一个视图,但我想根据我的业务规则验证返回的数据。例如,对象的数量为=7(一周),因此我不希望用户向列表中添加新对象。它们不是两个子系统,有域类和使用域类的mvc web应用程序,我想对mvc开发人员使用的方法进行更多控制,我称之为2个susbsystems。这里没有魔杖,在每一个门阶上验证你的数据。非常感谢,如果我打扰了你,我很抱歉,我只想用正确的方式来做。
1 5 true false 1 -1
2 7 false false 2 -1
3 1 false false 3 -1
4 2 false false 4 -1
5 3 false false 5 -1
6 4 false false 6 -1
7 6 true true 7 -1
1 6 true false 1 -1
2 7 false false 2 -1
3 1 false false 3 -1
4 2 false false 4 -1
5 3 false false 5 -1
6 4 false false 6 -1