在Windows Workflow Foundation(WWF)中,可以通过拖拽活动来构建应用程序。但是,如果现有的活动不能满足需求,或者不想使用CodeActivity,那么可以选择创建自定义活动。本文将介绍如何创建一个基础的FTP文件操作活动。
FTP活动支持从FTP服务器上传、删除和列出文件。可以通过将项目George.WWF.Activities.FTP添加到解决方案中,或者通过工具箱(Tools -> Choose toolbox items)将其添加到工具箱中来使用它。
一旦将活动拖放到设计窗口,活动会提示用户设置所需的属性。验证是通过FTPActivityValidator类来管理的,该类继承自ActivityValidator。
[ActivityValidator(typeof(FTPActivityValidator))]
public partial class FTPActivity : System.Workflow.ComponentModel.Activity
{
}
现在,可以决定如何在设计时或通过编程方式绑定属性;也许这些值可以来自配置文件:
private void initFTPActivity_ExecuteCode(object sender, EventArgs e)
{
this.ftpActivity1_FTPServer1 = "10.20.100.65";
this.ftpActivity1_FTPUserName1 = "Giorgio";
// ...
}
活动很容易定制,可以通过扩展FTP核心类来支持其他操作。以下是FTP管理器的代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
namespace George.WWF.Activities.FTP
{
public enum OperationType
{
Upload = 0,
Delete = 1,
List = 2
}
public class FtpManager
{
// Class members
OperationType operation;
NetworkCredential networkCredentials;
FtpEntity ftpEntity;
FtpWebRequest ftpWebRequest;
Stream ftpStream;
// Members modifiers
public OperationType Operation
{
get { return operation; }
}
public FtpManager(FtpEntity ftpEntity)
{
this.ftpEntity = ftpEntity;
}
public bool CreateFtpFile(string file, string destinationFolder)
{
// Implementation details...
}
public bool DeleteFtpFiles(string folder)
{
// Implementation details...
}
public string[] ListFtpFiles(string folder)
{
// Implementation details...
}
private bool DeleteFtpFile(string fileName, string folder)
{
// Implementation details...
}
private void SettingFtpManager()
{
// Implementation details...
}
private void ChooseOperationType()
{
// Implementation details...
}
}
}
以下是FTPEntity的代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace George.WWF.Activities.FTP
{
public class FtpEntity
{
string ftpServer, username, password;
public string FtpServer
{
get { return ftpServer; }
}
public string Username
{
get { return username; }
}
public string Password
{
get { return password; }
}
public FtpEntity(string ftpServer, string username, string password)
{
this.ftpServer = FormatFtpServer(ftpServer);
this.username = username;
this.password = password;
}
private string FormatFtpServer(string ftpServer)
{
if (!ftpServer.StartsWith("ftp://"))
ftpServer = "ftp://" + ftpServer;
return ftpServer;
}
}
}
设计时支持是一个可以在开发过程中产生重大影响并为传统类库增加额外价值的功能。Windows Workflow Foundation提供了构建应用程序的强大工具,但在控件方面却有所欠缺(大多数都不是免费的);本文提供了构建自定义活动的第一步。
通过自定义活动,可以更灵活地控制应用程序的行为,满足特定的业务需求。在开发过程中,设计时支持可以大大提高开发效率,使得活动更加易于配置和使用。