0

소셜 네트워킹 사이트에서 사용자 활동 피드를 처리하는 가장 적절한 방법을 찾고 있습니다.NHibernate + ASP.Net MVC + 사용자 활동 피드

  • 사용자
  • 사용자는
  • 사용자가 추가 자신의 즐겨 찾기에 게시물을 추가하는 사이트를 게시물에
  • 사용자 의견을 조인 순간 나는 같은 뉴스 피드에 나타날 수있는 여러 가지 활동을

    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 기본 클래스를 전달하려고 생각했습니다.

그러나 제안 사항은 공개되어 있습니다.

답변

0

비슷한 문제가 있지만 주문 유형이 다릅니다. 나는 도메인이 아닌 뷰 레이어 (웹/컨트롤러)에서 렌더링을 정의하기로 결정했습니다. 다음과 같이 할 수 있습니다.

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를 피할 방법이 있지만 지금은 알 수 없습니다.

이렇게하면 필요에 따라 아키텍처를 구성 및 플러그 할 수 있습니다.

추가적인 렌더링 관련 인터페이스를 정의하거나 IRenterer에 더 많은 속성을 추가 할 수 있습니다 (예 : PartialName 등). 또는 IRender에 lambda 필터를 사용하여 Factory가이 인터페이스 구현이 전달 된 (GetRenderer ("일부 조건") 조건). 많은 일이 가능합니다.

IoC 컨테이너 (ServiceLocator)를 원하지 않으면 NewsRendererFactory.GetRenderer 내에서 간단한 switch() 문을 사용하여 작업을 완료 할 수 있습니다. 이렇게하면 단일 팩토리 메서드 내에서 로직을 분리 할 수 ​​있으며 준비가되면 실제 IoC로 쉽게 대체 할 수 있습니다.

업데이트 : 렌더러를 얻는 방법. 여러 렌더러를 처리 할 수있는 경우의 IoC를 사용하지 않는 경우

, 당신이 할

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

같은 그런 다음 당신은 SingleOrDefault() 또는 ToList()를 선택할 수 있습니다.

+0

답해 주셔서 감사합니다. 정확히 내가해야 할 일처럼 들리며 내 디스플레이의 책임을 컨트롤러 수준으로 전달합니다. 감사합니다. –

+0

나는 이것을 얻으려고 노력하고 있지만, 나는 다른 유형의 NewsItem 목록 (소목 장이, 상태 업데이트 등)이있을 때 GetRenderer 을 호출하는 방법을 연구하는 데 어려움을 겪고있다. 해결 방법이 있습니까? –

+0

IoC없이이 작업을 수행하는 방법에 대한 답변을 추가했습니다. IoC 관련 답변은 다양한 컨테이너 (Windsor 등)에 따라 다르므로 일반적인 것을 제공 할 수는 없습니다. 수동 구현의 경우 간단한 캐싱을 사용하면 솔루션 속도가 빨라집니다. – queen3