2009-07-09 92 views
0

这是一个非常难以解释的问题,我希望我的代码提取能解释大部分问题。最佳实践:多实体到单个实体

比方说,你有以下的数据库设计: musicstyle relations http://img190.yfrog.com/img190/2080/musicstylerelations.jpg

你想建立一个通用界面修改所有三个实体之间的关系musicstyle。目前,我创建了一个MusicStyleController,它需要与其相关的实体类型(会员,事件或乐队)。

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyle(int id, string type, int typeid) 
{ 
    if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 

    switch (type) { 
     case "member": 
      _memberService.DeleteMusicStyle(member, id); 
      break; 
     case "band": 
      Band band = _bandService.GetBand(typeid); 
      _bandService.DeleteMusicStyle(band, id); 
      break; 
     case "event": 
      Event @event = _eventService.GetEvent(typeid); 
      _bandService.DeleteMusicStyle(@event, id); 
      break; 
    } 
    return SelectedMusicStyles(); 
} 

我让自己生病写这样的代码,但无法找到另一种更优雅的方式。

请注意,使用jquery.post()调用此函数。

你会如何重构这个代码,你会更加规范化数据库中的问题?请记住,我正在使用实体框架作为数据模型。

+0

什么你希望从标准化的数据库来获得?你期待什么样的数据量(I.E.,几千万行?) – Kane 2009-07-09 12:12:40

+0

@Kane在这种情况下,我正在努力寻求最佳实践,我不知道那是什么。这个数据库提供了与实体框架的平滑集成,并且使代码变得容易,如果我规范化它甚至更多,例如创建一个Band,Event和Member链接的MusicStyleCollection表会让代码变得更难。如果表增长异常大(这可能会),这将是一个performancehit。 – Peter 2009-07-09 19:37:20

+0

我刚刚添加它作为一个建议,因为可能有一种正常化数据库的方式,我还没有想到。我不认为自己是一个allknowing的开发人员,我从来都不是...... – Peter 2009-07-09 19:38:43

回答

1

假设id代表成员的id,您可以创建3个独立的函数来处理每个类型,从而将您的担忧分离得比现在更多。

例子:

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByMember(int id) 
{ 
    if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 
    _memberService.DeleteMusicStyle(member, id); 
    return SelectedMusicStyles(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByBand(int id, int typeid) 
{   
    Band band = _bandService.GetBand(typeid); 
    _bandService.DeleteMusicStyle(band, id); 
    return SelectedMusicStyles(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public JsonResult DeleteMusicStyleByEvent 
    (int id, int typeid) 
{ 
    Event event = _eventService.GetEvent(typeid); 
    _bandService.DeleteMusicStyle(event, id); 
    return SelectedMusicStyles(); 
} 

然后你只需修改您的jQuery的岗位去取决于你想做什么相应的方法。

1

你会如何重构这段代码?

1),其检查被记录在用户应该移动的代码:

if (!(Session["MemberLoggedIn"] is Member)) return Json(string.Empty); 
    Member member = (Member)Session["MemberLoggedIn"]; 

这是一个横切关注点,这应当使用安全框架施加,弹簧弹出介意作为例。 2)我会避免使用单例模式来表示这种使用情况,它们可以迅速变成一个脚本集合,当它变大时很难知道在哪里放置代码。考虑使用命令模式。

此模式将允许您将结果作为JSON,XML或任何其他格式返回,这些格式基于您的命令符合的接口。

class DeleteMusicStyleByBandCommand : JsonResultModelCommand, XmlResultModelCommand { 

    public DeleteMusicStyleByBand(int id, int typeid) { 
    //set private members 
    } 

    public void execute() { 
    .. 
    } 

    public JsonResult getJsonResult() { .. } 

    public XmlResult getXmlResult() { .. } 
} 

命令模式恕我直言,是代表使用情况比在服务很多方法要好得多..