Tag:开源 , 源码下载 , 控件 , 控件开发 , 皮肤 , Skin , Socket , 水印 , QQ表情 , 透明控件 , 异步编程 , 多线程编程 , WebService , WCF , WPF , Ribbon , 数据库 , SQL , WinForm教程 , SQLite , 接口 , 抽象类 , 设计模式 , 架构 , 插件 , Visual Studio , P/Invoke , 利用接口构建系统架构
 CS Windows 程序员之窗
 
您的位置: >> 首页 >> C# 博文 >> 利用接口构建系统架构的实践和反思

利用接口构建系统架构的实践和反思

2010-07-28  来自:CSDN  字体大小:【  
  • 摘要:本文为作者利用接口构建系统架构的一次实践和反思

利用接口构建系统架构的一次实践和反思:
 

namespace MyApplication.Library
{
/*架构设计版本*/
public abstract class AdapterFramework
{
public abstract IScheme[] LoadScheme();
public abstract void FireScheme(IScheme scheme, ILog log);
}
/*最终交付版本*/
public class AdapterFramework
{
//基本没有修改,除了取消abstract修饰以外,
//因为没有必要采用重载实现,同时采用了一个static限制
public static IScheme[] LoadScheme();
//基本没有修改,除了取消abstract修饰以外,
//因为没有必要采用重载实现,同时采用了一个static限制
public static void FireScheme(IScheme scheme, ILog log);
}
/*架构设计版本*/
public interface IDataAdapter
{
DataTable LoadTable(
string table);
}
/*最终交付版本*/
public interface IDataAdapter : IComponent
{
//增加了IFunctionComponent参数,设计未实现,需求已定义,
//在调用遗留系统中的ExcelHelper相关方法时,需要IProcess,
//IStateHandle作为调用时必须扮演的参数,而在设计时就已
//知由IFunctionComponent包装IProcess功能,因此设计时应考虑本因素
DataTable LoadTable(IFunctionComponent function, string table);
//增加了重载的LoadTable方法,当外部没有显式提供一个
//string参数时,提供一个默认的实现(由string File和string FileDetail支持)
DataTable LoadTable(IFunctionComponent function);
string File { get; set; }//由于在ExcelAdapter的实现中,需要获取文件名称
//由于在ExcelAdapter的实现中,需要获取Excel中
//的目标Sheet名称进行加载,需求已定义,设计未实现
string FileDetail { get; set; }
//由于在ExcelAdapter的实现中,需要制定操作完成后
//是否删除原始文件的策略,需求已定义,设计未实现
SucceedStrategy SucceedStrategy { get; set; }
}
/*架构设计版本*/
public interface IDataObjective
{
void ExecuteUpdateTransaction(string[] sqlScripts);
OracleConnection PopActiveOracleConnection();
void PushActiveOracleConnection(OracleConnection activeConnection);
}
/*最终交付版本*/
public interface IDataObjective : IComponent
{
void ExecuteUpdateTransaction(string[] sqlScripts);
OracleConnection PopActiveOracleConnection();
void PushActiveOracleConnection(OracleConnection activeConnection);
//对于一个目标数据对象来说,如果目标对象是关系
//数据库,那么没有什么比链接字串更重要的属性了
string ConnectionString { get; set; }
}
/*架构设计版本*/
public interface IDataSource
{
DataTable ExecuteReadTransaction(
string[] sqlScripts);
//本方法在最终交付版本中被移除是因为实现中发现不能
//将IDataAdapter和IDataSource混合在一起,无形中增加
//了复杂度,IDataAdapter和IDataSource同样能够提供数据源,
//但是在同一个解决方案定义中又是互斥的
void SetDataAdapter(IDataAdapter dataAdapter);
IDataAdapter GetDataAdapter();
//同上
}
/*最终交付版本*/
public interface IDataSource : IComponent
{
//修改了string[]声明,在一个执行脚本的环境中,
//因为string[]元素间没有关联,或者ExecuteReadTransaction
//方法无法获知关联,因此采用string更加实际
DataTable ExecuteReadTransaction(string sqlScripts);
//对于一个信宿数据对象来说,如果信宿对象是关系数据库,
//那么没有什么比链接字串更重要的属性了
string ConnectionString { get; set; }
}
/*架构设计版本*/
public interface IFunctionComponent
{
void SetStrategy(IStrategy[] strategy);
IStrategy[] GetStrategy();
void Execute(ILog log);
void SetDataSource(IDataSource dataSource);
void SetDataObjective(IDataObjective dataObjective);
IDataSource GetDataSource();
IDataObjective GetDataObjective();
}
/*最终交付版本*/
public interface IFunctionComponent : IComponent, IEditor, IParameterHandle, IStateHandle
{
//IEditor,IParameterHandle,IStateHandle是
//遗留系统中对IProcess进行调用时必须扮演的参数,
//作为两个系统间的假面舞会,没有什么能够比当初
//的接口设计架构更能够支持灵活的功能交互了
void SetStrategy(IStrategy[] strategies);
IStrategy[] GetStrategy();
//去掉了ILog参数是因为,IFunctionComponent其它
//的方法被执行环境调用时,ILog由于是null而无法执行
//日志记录工作,造成无法跟踪IFunctionComponent
//其它方法的内部情况,进而采用void SetLog(ILog log);
//进行替代解决
void Execute();
void SetDataSource(IDataSource dataSource);
void SetDataObjective(IDataObjective dataObjective);
//需求已定义,需要复用遗留系统中的IProcess,
//但设计未实现,本方法作为IProcess的一个包装
IProcess WrappedProcess { get; }
IDataSource GetDataSource();
IDataObjective GetDataObjective();
//作为IFunctionComponent的数据源的替代实现,
//IDataAdapter必须突破IDataSource的掩盖独立出来
void SetDataAdapter(IDataAdapter dataAdapter);
IDataAdapter GetDataAdapter();
//同上
//由于IDataAdapter和IDataSource的互斥关系,
//IFunctionComponent必须表明自己的立场
DataSourceType GetDataSourceType();
void SetDataSourceType(DataSourceType dataSourceType);//同上
//IFunctionComponent与IScheme是多对一的关系,
//所以必须显式声明以表明这种层次关系
void SetSchemeId(int schemeId);
int GetSchemeId();//同上
//剔除了void Execute(ILog log);
//中的ILog参数,目的是在整个内部共享ILog
void SetLog(ILog log);
}
/*架构设计版本*/
public interface ILog
{
void WriteLog(ILog[] log);
void DeleteLog(ILog[] log);
void SetID(int id);
int GetID();
void SetEvent(String events);
string GetEvent();
void SetSender(String sender);
string GetSender();
void SetTime(DateTime time);
DateTime GetTime();
}
/*最终交付版本*/
public interface ILog
{
//本次设计最大的败笔,在架构设计时,考虑ILog的
//存储结构是合理的,但是将属性和基于这些属性的
//操作声明在同一个接口中被证明是失败的,
//实现过程中无论怎么去观察,都有如鲠在喉
void WriteLog(string sEvent, object sender,
string sTrace, LogType logType);
}
/*架构设计版本*/
public interface IScheme
{
IFunctionComponent SetFunction(IFunctionComponent function);
void FireFunction(IFunctionComponent function, ILog log);
IStrategy[] GetStrategy();
void SetStrategy(IStrategy[] strategy);
IFunctionComponent GetFunction();
//需求已定义,设计未考虑,其实IDataSource和
//IDataAdapter仅对IFunctionComponent才有意义,
//作为IFunctionComponent的一个一对多的包装,
//既然不知道如何去分派,又何必多次一举?
void SetDataSource(IDataSource dataSource);
IDataSource GetDataSource();
//同上
IDataObjective GetDataObjective();//同上
void SetDataObjective(IDataObjective dataObjective);//同上
}
/*最终交付版本*/
public interface IScheme : IComponent
{
IFunctionComponent[] SetFunction(IFunctionComponent[] functions);
void FireFunction(IFunctionComponent function, ILog log);
IStrategy[] GetStrategy();
void SetStrategy(IStrategy[] strategies);
IFunctionComponent[] GetFunction();
//需求已定义,方案的激活策略,按月,按周,
//按天,因此接口定义时必须将这些约束定义进来
FireType GetFireType();
void SetFireType(FireType fireType);//同上
//如果执行环境需要激活IScheme,而IScheme
//没有提供自己的FireTime,目的如何达成?
DateTime GetFireTime();
//作为操作接口和存储实体之间的转换,
//关键的属性必须从存储注入到操作接口中
void SetFireTime(DateTime fireTime);
//当采用按月,按周策略时,多个日期以逗号
//分割的一个字串列表体现了需要激活的日期
string[] GetFireDays();
void SetFireDays(string[] fireDays);//同上
}
/*架构设计版本*/
public interface IStrategy
{
void SetContext(object context);
bool Apply();
}
/*最终交付版本*/
public interface IStrategy : IComponent
{
void SetContext(object context);
bool Apply(ILog log);//策略执行的时候,也需要进行日志记录,不是吗?
}
/*架构设计版本*/
public class VirtualEntityModel
{
private int Id;
private string Name;
private string Code;
private string Summary;

}
/*最终交付版本*/
public class VirtualEntityModel
{
protected int _id;//采用protected为继承开放了绿灯
protected string _name;//同上
protected string _code;//同上
protected string _summary;//同上

}
/*最终交付版本中增加接口定义*/
public interface IComponent
{
//本接口基本上为在关系数据存储对象和动态链接库文件反射对象
//之间提供了一个联系的纽带,使它们能够在多持久机制的架构系统之中自由转换

//无论将对象持久化到关系数据库中,还是一个动态链接库文件里,
//它都需要标识,如果它的痕迹还需要出现在关系数据库中,那么这些标示就更为重要
void SetID(int id);
int GetID();//同上
string GetName();//同上
void SetName(string name);//同上
}
}

 

作者:sharpnessdotnet
相关文章:
该文章已有条评论 我要发表评论
Website Statisticsflip hd camcorder