最佳实践:多个实体到单个实体

时间:2009-07-09 12:00:42

标签: c# asp.net-mvc entity-framework

这是一个很难解释的问题,我希望我的代码提取解释了大部分内容。

假设您有以下数据库设计: musicstyle relations http://img190.yfrog.com/img190/2080/musicstylerelations.jpg

并且您想构建一个通用接口来修改所有三个实体之间的音乐风格关系。目前我已经创建了一个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()调用此函数。

问题

您将如何重构此代码,您是否会更加规范化数据库?请记住,我正在使用实体框架作为数据模型。

2 个答案:

答案 0 :(得分: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)

  

你会如何重构这段代码?

1)应该移动检查用户登录的代码:

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

这是一个跨领域的问题,应该使用安全框架来应用,以Spring为例。

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() { .. }
}

命令模式IMHO在表示用例方面要比服务中的许多方法好得多。