Smart Client Software Factory 如何使用Action Catalog

首先需要了解Action Catalog这个玩意是干嘛用的,官网上的解释为,它可以决定程序中一个业务动作是否执行。在网上看了看,它使用最多的情况是权限控制。

下面看看怎么在SCSF中加入Action Catalog

首先在Infrastructure.Module项目中添加一个类 MyActionCondition ,并继承IActionCondition 接口,同时引用两个命名空间

using System.Threading;
using Microsoft.Practices.CompositeUI;
然后在MyActionCondition类中,我们需要实现IActionCondition 接口的CanExecute方法

C#
public bool CanExecute(string action, WorkItem context, object caller, object target)
{
  if (action == "ShowMyView" && Thread.CurrentPrincipal.Identity.Name == "Officer")
  {
    return true;
  }
  else
  {
    return false;
  }
}
接着,需要修改Infrastructure.Module工程中的Module.cs

需要引用命名空间,rootnamespace根据你自己项目的名字来,下面不再复述这个问题。

using rootnamespace.Infrastructure.Interface.Services;

下面的步骤就是在Modules 中注册 MyActionCondition 中的action catalog了,在Module.cs中加入如下方法

public override void AddServices()
{
  base.AddServices();
  IActionCatalogService catalog = _rootWorkItem.Services.Get<IActionCatalogService>();
  catalog.RegisterGeneralCondition(new MyActionCondition());
}
下一步,需要修改Shell工程中的ShellApplication,首先引用两个命名空间

using rootnamespace.Infrastructure.Library.BuilderStrategies;
using Microsoft.Practices.ObjectBuilder;
然后需要重写AddBuilderStrategies方法,把ActionStrategy加入到ObjectBuilder。该策略指定Builder的初始化阶段。这个策略会反射由ObjectBuilder创建的对象方法,并把打上Action属性标签的方法,加入Action catalog中

protected override void AddBuilderStrategies(Builder builder)
{
  base.AddBuilderStrategies(builder);
  builder.Strategies.AddNew<ActionStrategy>(BuilderStage.Initialization);
}
下面需要修改MyModule工程中Constants文件夹下的ActionNames.cs

[csharp]  view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace ActionCatalog.MyModule.Constants  
  7. {  
  8.     public class ActionNames  
  9.     {  
  10.         public const string ShowMyView = "ShowMyView";    
  11.     }  
  12. }  
ShowMyView这是给这个Action起了个名字。

接下来在MyModule工程中新建一个类 ModuleActions,里面的ShowMyView方法打上了Action的属性标签,这个方法就被注册到Action Catalog 中,以此来控制这个被注册的方法在满足条件的情况下执行。

C#
public class ModuleActions
{
  private WorkItem _workItem = null;

  [ServiceDependency]
  public WorkItem WorkItem
  {
    get { return _workItem; }
    set { _workItem = value; }
  }

  [Action(Constants.ActionNames.ShowMyView)]
  public void ShowMyView(object caller, object target)
  {
    IMyView view = WorkItem.Items.AddNew<MyView>();
    WorkItem.Workspaces[Constants.WorkspaceNames.RightWorkspace].Show(view);
  }
}
然后在MyModule工程中修改 ModuleController.cs

首先要注册这个Action,添加如下方法

[csharp]  view plain copy print ?
  1. private void RegisterActions()  
  2. {  
  3.     WorkItem.Items.AddNew<ModuleActions>();  
  4. }  

然后要执行这个Action,添加如下方法

[csharp]  view plain copy print ?
  1. private void ExecuteActions()  
  2. {  
  3.     ActionCatalogService.Execute(Constants.ActionNames.ShowMyView, WorkItem, thisnull);  
  4. }  
最后需要在Run方法上加上刚才创建的两个方法

public override void Run()
{
  RegisterActions();
  ExecuteActions();
}
到这里就算完成了!

===============================================================

再拿一个老外的文章的例子说说

http://weblogs.asp.net/bsimser/archive/2007/10/26/taming-the-actioncatalog-in-scsf.aspx

这个老外,他有一个ModuleController类,在类中,他有一些权限判断要做,比如只有某个角色的用户才能看到某某菜单

[csharp]  view plain copy print ?
  1. public class ModuleController : WorkItemController  
  2. {  
  3.     public override void Run()  
  4.     {  
  5.         ExtendMenu();  
  6.     }  
  7.    
  8.     private void ExtendMenu()  
  9.     {  
  10.         ToolStripMenuItem conditionalMenu = new ToolStripMenuItem("Conditional Code");  
  11.         if (canManageUsers())  
  12.         {  
  13.             conditionalMenu.DropDownItems.Add(new ToolStripMenuItem("Manage Users"));  
  14.         }  
  15.         if (canManageAdministrators())  
  16.         {  
  17.             conditionalMenu.DropDownItems.Add(new ToolStripMenuItem("Manage Administrators"));  
  18.         }  
  19.         WorkItem.UIExtensionSites[UIExtensionSiteNames.MainMenu].Add(conditionalMenu);  
  20.     }  
  21.    
  22.     private bool canManageAdministrators()  
  23.     {  
  24.         string userName = Thread.CurrentPrincipal.Identity.Name;  
  25.         return  
  26.             Thread.CurrentPrincipal.Identity.IsAuthenticated &&  
  27.             userName.ToLower().Equals("domain\\admin");             
  28.     }  
  29.    
  30.     private bool canManageUsers()  
  31.     {  
  32.         string userName = Thread.CurrentPrincipal.Identity.Name;  
  33.         return  
  34.             Thread.CurrentPrincipal.Identity.IsAuthenticated &&  
  35.             userName.ToLower().Equals("domain\\joeuser");  
  36.     }  
  37. }  
判断的方法虽然可以重用,但是大量的条件判断语句让人感觉不舒服,这个时候就是Action Catalog出场的时候了

下面他定义了几个不同的业务逻辑判断的方法

[csharp]  view plain copy print ?
  1. class AuthenticatedUsersCondition : IActionCondition  
  2. {  
  3.     public bool CanExecute(string action, WorkItem context, object caller, object target)  
  4.     {  
  5.         return Thread.CurrentPrincipal.Identity.IsAuthenticated;  
  6.     }  
  7. }  

[csharp]  view plain copy print ?
  1. class UserCondition : IActionCondition  
  2. {  
  3.     public bool CanExecute(string action, WorkItem context, object caller, object target)  
  4.     {  
  5.         string userName = Thread.CurrentPrincipal.Identity.Name;  
  6.         return userName.ToLower().Equals("domain\\joeuser");  
  7.     }  
  8. }  

[csharp]  view plain copy print ?
  1. class AdministratorCondition : IActionCondition  
  2. {  
  3.     public bool CanExecute(string action, WorkItem context, object caller, object target)  
  4.     {  
  5.         string userName = Thread.CurrentPrincipal.Identity.Name;  
  6.         return userName.ToLower().Equals("domain\\admin");  
  7.     }  
  8. }  

上面对三种角色进行了判断。

然后创建一个业务动作类,来处理业务动作

[csharp]  view plain copy print ?
  1. public class ModuleActions  
  2. {  
  3.     private WorkItem _workItem;  
  4.    
  5.     [ServiceDependency]  
  6.     public WorkItem WorkItem  
  7.     {  
  8.         set { _workItem = value; }  
  9.         get { return _workItem; }  
  10.     }  
  11.    
  12.     [Action(ActionNames.ShowUserManagementMenu)]  
  13.     public void ShowUserManagementMenu(object caller, object target)  
  14.     {  
  15.         ToolStripMenuItem conditionalMenu = (ToolStripMenuItem) target;  
  16.         conditionalMenu.DropDownItems.Add(new ToolStripMenuItem("Manage Users"));  
  17.     }  
  18.    
  19.     [Action(ActionNames.ShowAdministratorManagementMenu)]  
  20.     public void ShowAdministratorManagementMenu(object caller, object target)  
  21.     {  
  22.         ToolStripMenuItem conditionalMenu = (ToolStripMenuItem)target;  
  23.         conditionalMenu.DropDownItems.Add(new ToolStripMenuItem("Manage Administrators"));  
  24.     }  
  25. }  

最后,我们还需要在ModuleController中对业务动作进行注册到执行

[csharp]  view plain copy print ?
  1. public class ModuleController : WorkItemController  
  2. {  
  3.     private ToolStripMenuItem _rootMenuItem;  
  4.    
  5.     public override void Run()  
  6.     {  
  7.         ExtendMenu();  
  8.         RegisterActionCatalog();  
  9.         RegisterActionConditions();  
  10.         ExecuteActions();  
  11.     }  
  12.    
  13.     private void ExtendMenu()  
  14.     {  
  15.         _rootMenuItem = new ToolStripMenuItem("Action Catalog");  
  16.         WorkItem.UIExtensionSites[UIExtensionSiteNames.MainMenu].Add(_rootMenuItem);  
  17.     }  
  18.    
  19.     private void ExecuteActions()  
  20.     {  
  21.         ActionCatalogService.Execute(ActionNames.ShowUserManagementMenu, WorkItem, this, _rootMenuItem);  
  22.         ActionCatalogService.Execute(ActionNames.ShowAdministratorManagementMenu, WorkItem, this, _rootMenuItem);  
  23.     }  
  24.    
  25.     private void RegisterActionConditions()  
  26.     {  
  27.         ActionCatalogService.RegisterGeneralCondition(new AuthenticatedUsersCondition());  
  28.         ActionCatalogService.RegisterSpecificCondition(ActionNames.ShowUserManagementMenu, new UserCondition());  
  29.         ActionCatalogService.RegisterSpecificCondition(ActionNames.ShowAdministratorManagementMenu, new AdministratorCondition());  
  30.     }  
  31.    
  32.     private void RegisterActionCatalog()  
  33.     {  
  34.         WorkItem.Items.AddNew<ModuleActions>();  
  35.     }  
  36. }  
最后在ShellApplication中注册这个策略

[csharp]  view plain copy print ?
  1. protected override void AddBuilderStrategies(Builder builder)  
  2. {  
  3.     base.AddBuilderStrategies(builder);  
  4.     builder.Strategies.AddNew<ActionStrategy>(BuilderStage.Initialization);  
  5. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值