2009-10-04 9 views
3

프리즘 (CAL) 프레임 워크를 만들려고합니다. (이것은 CAL에 대한 첫 번째 포어입니다.) 지역의 메뉴 항목 등록 서비스를 고안하는 데 어려움이 있습니다. 여기에 프리즘 응용 프로그램의 메뉴 서비스 CAL

/// <summary> 
/// Menu item service - allows any module to register menu items with any region 
/// </summary> 
public class MenuService : IMenuService 
{ 
    private IUnityContainer m_UnityContainer; 
    private IRegionManager m_RegionManager; 
    private Dictionary<string, IUnityContainer> m_MenuContainers = new Dictionary<string,IUnityContainer>(); 

    /// <summary> 
    /// Injection ctor 
    /// </summary> 
    /// <param name="unityContainer"></param> 
    /// <param name="regionManager"></param> 
    public MenuService(IUnityContainer unityContainer, IRegionManager regionManager) 
    { 
     m_UnityContainer = unityContainer; 
     m_RegionManager = regionManager; 
    } 

    /// <summary> 
    /// Registers a menu item with the service 
    /// </summary> 
    /// <param name="topLevelName"></param> 
    /// <param name="regionIdentity"></param> 
    /// <param name="displayText"></param> 
    public void RegisterMenuItem(string topLevelName, string regionIdentity, string displayText) 
    {  
     IUnityContainer container = GetOrCreateUiIdentityContainer(regionIdentity); 

     if (string.IsNullOrEmpty(topLevelName)) 
      container.RegisterInstance("MENUITEM" + displayText, new MenuItem { Header = displayText}); 
     else 
     { 
      MenuItem topLevel = container.Resolve<MenuItem>("MENUITEM" + topLevelName); 
      if (topLevel.Header == null) 
      { 
       topLevel = new MenuItem{ Header = topLevelName}; 
       container.RegisterInstance<MenuItem>("MENUITEM" + topLevelName, topLevel); 
      } 
      MenuItem newItem = new MenuItem{Header = displayText}; 
      topLevel.Items.Add(newItem); 
      container.RegisterInstance("MENUITEM" + topLevelName + "_" + displayText, newItem); 
     } 
    } 

    private IUnityContainer GetOrCreateUiIdentityContainer(string regionIdentity) 
    { 
     IUnityContainer container; 
     container = GetUnityContainer(regionIdentity); 
     if (container != null) 
      return container; 

     container = m_UnityContainer.CreateChildContainer(); 
     m_MenuContainers.Add(regionIdentity, container); 
     return container; 
    } 

    private IUnityContainer GetUnityContainer(string regionIdentity) 
    { 
     IUnityContainer container; 
     m_MenuContainers.TryGetValue(regionIdentity, out container); 
     return container; 
    } 

    /// <summary> 
    /// Builds up the menu for a given region 
    /// </summary> 
    /// <param name="regionIdentity"></param> 
    public void BuildMenu(string regionIdentity) 
    { 
     IUnityContainer container; 
     container = GetUnityContainer(regionIdentity); 
     if (container == null) 
      return; 

     IRegion region = m_RegionManager.Regions[regionIdentity]; 
     if (region == null) 
      return; 

     IEnumerable<MenuItem> menuItems = container.ResolveAll<MenuItem>(); 

     foreach (MenuItem item in menuItems) 
     { 
      if (item.Role == MenuItemRole.SubmenuHeader) 
       region.Add(item); 
     } 
    } 

} 

는 내가 뭘하려고 오전 할 수있는 더 좋은 방법이 있나요 ... 내가 지금까지 함께 온 무엇인가? 건배, Jason

답변

1

샘플을 가지고 있습니다. 정확히이 작업을 수행 할 수 있습니다. 바라기를 이것은 조금 도움이 될 것입니다. 보고 난 후에 궁금한 점이 있으면 알려주십시오! http://dl.getdropbox.com/u/376992/CAGMenus.zip

희망이 있습니다.