Лучшая практика: несколько организаций в одну организацию - PullRequest
0 голосов
/ 09 июля 2009

Это очень сложный для объяснения вопрос, и я надеюсь, что мой фрагмент кода объясняет большинство из них.

Допустим, у вас есть следующий дизайн базы данных: отношения в музыкальном стиле 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 ().

Вопрос

Как бы вы провели рефакторинг этого кода и нормализовали бы базу данных еще больше? Помните, что я использую Entity Framework в качестве модели данных.

Ответы [ 2 ]

1 голос
/ 09 июля 2009

Как бы вы изменили этот код?

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

Шаблон Command IMHO гораздо лучше представляет варианты использования, чем многие методы в Сервисе.

1 голос
/ 09 июля 2009

Предполагая, что 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, чтобы перейти к соответствующим методам в зависимости от того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...