随笔 - 234, 文章 - 12, 评论 - 1671, 阅读 - 74万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

隐藏自定义复合活动的内部实现

Posted on   生鱼片  阅读(1723)  评论(3编辑  收藏  举报

有的时候我们为了解决特定的问题,来自己实现一个自定义活动,该活动包含一组子活动。我们举个简单的例子,我们开发一个自定义活动CaryEncapsulationActivity。我们选择活动的基类为SequenceActivity,在该活动我们只提供一个TestValue的属性给外部,代码如下:

public static DependencyProperty TestValueProperty = DependencyProperty.Register("TestValue",
                                           typeof(String), typeof(CaryEncapsulationActivity));

[DescriptionAttribute("TestValue")]
[CategoryAttribute("接口")]
[BrowsableAttribute(true)]
[DesignerSerializationVisibilityAttribute(
DesignerSerializationVisibility.Visible)]
public String TestValue
{
   get
   {
       return ((String)(base.GetValue(CaryEncapsulationActivity.TestValueProperty)));
   }
   set
   {
       base.SetValue(CaryEncapsulationActivity.TestValueProperty, value);
   }
}

然后向该活动中添加两个CodeActivity,他们事件处理程序如下:
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
     Console.WriteLine("我爱:{0}",TestValue);
}
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
     Console.WriteLine("我要报效:{0}", TestValue);
}
 

很简单这个自定义活动就完成了,我们添加到工作流中,效果如下图:     

ca1 

    

执行的结果如下:   

---工作流开始---
我爱:我的祖国
我要报效:我的祖国
---工作流结束---
请按任意键继续. . .

    
程序执行结果没有任何问题,但是我们只是设置了CaryEncapsulationActivity活动提供的接口属性TestValue的值,从工作流设计器我们可以看出CaryEncapsulationActivity活动是通过两个CodeActivity来执行的,这样我们就爆露了活动的内部的结构,但我们并不需要知道CaryEncapsulationActivity活动内部是怎么处理该属性的,现在我们只需要给CaryEncapsulationActivity加上如下代码为活动设计器提供强制基类: 
[Designer(typeof(ActivityDesigner), typeof(IDesigner))]
public partial class CaryEncapsulationActivity: SequenceActivity
{.....}
 

我们从新生成项目后在看下工作流设计器的效果,如下图: 
ca2 
 
从上图可以看出工作流设计器中的CaryEncapsulationActivity活动的子活动看不到了,这样我只需要设置TestValue
属性,不必也无需知道该活动内部是如果处理的。执行程序的结果和上面是一样的。

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示