【发布时间】:2011-02-02 17:35:16
【问题描述】:
这个问题是我之前的帖子here 的后续问题。 Martinho 要求我提供有关我的系统的更多信息。他建议可能有更好的方法来实现我正在尝试的目标。所以,如果这里有问题,我想我想知道这是否是糟糕的设计?如果是这样,可以改进什么以及如何改进(我从插图中学到最好的东西)。谢谢。
我正在为工作中的 iPhone 应用程序设计中间件。
开发人员不想从客户端显式调用各种对象,而是希望使用泛型,其中“组”根据传入的参数返回 JSON 字符串。该参数表示用户登录时看到的第一个屏幕。我们将登录屏幕称为“仪表板”。
所以,当客户端调用服务端方法时:
Contracts.GroupDto IDashboardService.GetGroupById(string groupId)
{
var obj = GroupRepository.GetGroupById(groupId);
return new Contracts.GroupDto
{
...
};
}
服务器使用GroupRepository方法GetGroupById返回一个通用对象类型:
public static IList<G> GetGroupById<G>(int groupId)
{
DashboardGroupType type = (DashboardGroupType)groupId;
IList<G> result = new List<G>();
var obj = default(G);
switch (type)
{
case DashboardGroupType.Countries:
break;
case DashboardGroupType.Customers:
// this returns a list of typ IEnumerable<Customer>
obj = (G) CustomerRepository.GetAllCustomers();
break;
case DashboardGroupType.Facilities:
// this returns a list of typ IEnumerable<Facility>
obj = (G) FacilityRepository.GetAllFacilities();
break;
case DashboardGroupType.Heiarchy:
break;
case DashboardGroupType.Lines:
break;
case DashboardGroupType.Regions:
// this returns a list of typ IEnumerable<string>
obj = (G) CustomerRepository.GetRegionsHavingCustomers();
break;
case DashboardGroupType.States:
// // this returns a list of typ IEnumerable<Customer>
obj = (G) CustomerRepository.GetStatesHavingCustomers();
break;
case DashboardGroupType.Tanks:
break;
default:
break;
}
result.Add(obj);
return result;
}
返回的对象类型基于传入GetGroupById的参数。例如,如果值为 1,则该方法查看 DashboardGroupType 枚举:
并传递参数1,服务器查看以下枚举:
public enum DashboardGroupType
{
Countries = 0,
Regions = 1,
Customers = 2,
Facilities = 3,
Lines = 4,
Tanks = 5,
States = 6,
Heiarchy = 7
}
并向调用客户端返回 IEnumerable 类型的区域列表。
关于这个设计的任何想法(特别是关于 IList GetGroupById(int groupId) 方法?如果你有建议,我会很感激你的改进说明。
提前致谢。
【问题讨论】:
-
你不是说,层次结构吗? :)
-
我认为您的意思是“层次结构”。 Switch 语句和强制转换有时是代码异味。这种方法似乎做了不止一件事(参见单一职责原则)。我不知道你的问题领域,所以我没有具体的建议。
标签: c# design-patterns generics