NHibernate + ASP.Net MVC + Лента активности пользователей - PullRequest
0 голосов
/ 04 февраля 2010

Я ищу наиболее подходящий способ работы с фидом активности пользователей на моем сайте социальной сети.На данный момент у меня есть несколько действий, которые могут появляться в ленте новостей, таких как:

  • Пользователи присоединяются к сайту
  • Комментарии пользователей к записи
  • Пользователь добавляетДобавить в избранное
  • Пользователь добавляет новый пост на сайт

Вот упрощенная версия объектов моего домена на данный момент:

public abstract class NewsItem : Entity, ITenantSpecific  
{  

    public virtual Account Account { get; set; }  
    public virtual DateTime DateTime { get; set; }  

    // returns formatted news html string which gets 
    // overridden by inherted classes  
    public abstract string GetNewsHtml();  
}


public class NewsItemJoiner : NewsItem
{  
    public virtual Account AccountJoined { get; set; }

    public override string GetNewsHtml()
    {
        return "XXX has just joined our music network";
    }
}

КакВы можете видеть, что в данный момент у меня есть свойство, которое должно быть переопределено для каждого действия, которое называется GetNewsHtml.Это не идеально, так как я не верю, что мой домен должен отвечать за генерацию моего HTML.

Я думал об использовании частичного представления для каждого типа активности и передаю в него базовый класс NewsItem, пониженныйв правильный тип.

Однако я открыт для предложений.

1 Ответ

0 голосов
/ 08 февраля 2010

У меня похожая проблема, но с разными типами заказов. Я решил определить рендеринг на уровне представления (веб / контроллеры), а не на домене. Вы можете сделать это так:

public interface IRenderer<T> where T: NewsItem 
{
   string Render(T item);
}

public class NewsItemJoinerRenderer: IRenderer<NewsItemJoiner>
{
   public string Render(T item)
   {
       return "XXX has just joined our music network";
   }
}

public class NewsRendererFactory
{
   public IRenderer<T> GetRenderer<T>()
   {
        return ServiceLocator.GetInstance<IRenderer<T>>();
   }
}

Затем вы можете передать NewsRendererFactory контроллеру. Возможно, есть способ избежать ServiceLocator, но пока я не могу сказать.

Обратите внимание, что это делает вашу архитектуру настраиваемой и подключаемой при необходимости.

Вы можете определить дополнительные интерфейсы, связанные с рендерингом, добавить дополнительные свойства в IRenderer - например, PartialName и т. Д., Или иметь лямбда-фильтры в IRenderer, которые Фабрика использует, чтобы решить, применима ли эта реализация интерфейса для переданного (для GetRenderer ( «некоторое состояние»)) состояние. Многое возможно.

Если вам не нужны контейнеры IoC (ServiceLocator), вы можете выполнить свою работу с помощью простого оператора switch () внутри NewsRendererFactory.GetRenderer. Это изолирует логику внутри метода единой фабрики, и вы сможете легко заменить ее истинным IoC, как только будете готовы.

Обновление: как получить рендереры.

Если вы не используете IoC, вы делаете что-то вроде

 typeof(IRenderer<>).Assembly.GetTypes().Where(x =>
        x.IsGenericType &&
        x.GetGenericTypeDefinition() == typeof(IRenderer<>) &&
        x.GetGenericArguments().FirstOrDefault() == requestedTypeArguments)

Затем вы можете выбрать SingleOrDefault () или ToList (), если вы можете обрабатывать несколько визуализаторов.

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