ASP.NET三层架构源码(CodeSmith版)之六:Table-生成DALFactory

动软代码生成器生成的ASP.NET三层架构代码比较规范,是学习ASP.NET的好例子

此三层架构改造自动软的工厂模式模板,使用CodeSmith进行重写,以方便大家修改模板文件

以下是针对表格的DAL生成工厂的源码:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="OutputFileCodeTemplate" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
<%-- SchemaExplorer --%>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="CodeSmith.BaseTemplates" %>
<%@ Assembly Name="CodeSmith.CustomProperties" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="CodeSmith.BaseTemplates" %>
<%@ Import Namespace="CodeSmith.CustomProperties" %>

<%-- 添加源数据库属性 --%>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema"  DeepLoad="True" Optional="False" Category="01. GettingStarted - Required" Description="Database" %>

<%@ Property Name="Namespace" Type="String" Category="Context" Description="NameSpace" Default="CrsNameSpace"%>  
<%@ Property Name="Author" Type="String" Category="Context"  Description="Author" Default="chenr"%>  
<%@ Property Name="TablePrefix" Type="System.String" Default="T" Category="Context" Description="The prefix to remove from table names" %>  
/*------------------------------------------------ 
// File Name:DALFactory.cs 
// File Description:DAL Factory 
// Author:<%=Author%> 
// Create Time:<%= DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")%> 
//------------------------------------------------*/  
 
using System;
using System.Reflection;
using System.Configuration;

using <%=Namespace%>.IDAL;
  
namespace <%=Namespace%>.DALFactory  
{  
    /// 
	/// 抽象工厂模式创建DAL。
	/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口) 
	/// DataCache类在导出代码的文件夹里
	///  
	///  (这里的命名空间根据实际情况更改为自己项目的命名空间)
	///  
	/// 
	public sealed class <%=Namespace%>DALFactory
	{
        private static readonly string AssemblyPath = ConfigurationManager.AppSettings["DAL"];
		/// 
		/// 创建对象或从缓存获取
		/// 
		public static object CreateObject(string AssemblyPath,string ClassNamespace)
		{
			object objType = DataCache.GetCache(ClassNamespace);//从缓存读取
			if (objType == null)
			{
				try
				{
					objType = Assembly.Load(AssemblyPath).CreateInstance(ClassNamespace);//反射创建
					DataCache.SetCache(ClassNamespace, objType);// 写入缓存
				}
				catch
				{}
			}
			return objType;
		}
		/// 
		/// 创建数据层接口
		/// 
		//public static t Create(string ClassName)
		//{
			//string ClassNamespace = AssemblyPath +"."+ ClassName;
			//object objType = CreateObject(AssemblyPath, ClassNamespace);
			//return (t)objType;
		//}
        
        <% foreach(TableSchema TableName in this.SourceDatabase.Tables) %>
		<% { %>        
        /// 
		/// 创建<%=ClearPrefix(TableName.Name) %>数据层接口。
		/// 
		public static I<%=ClearPrefix(TableName.Name) %> Create<%=ClearPrefix(TableName.Name) %>()
		{
			string ClassNamespace = AssemblyPath +".<%=ClearPrefix(TableName.Name) %>";
			object objType=CreateObject(AssemblyPath,ClassNamespace);
			return (I<%=ClearPrefix(TableName.Name) %>)objType;
		} 
        
        <% } %>
        ///////////////////////////////////////////////////////////////////////////////
        
        <% foreach(ViewSchema ViewName in this.SourceDatabase.Views) %>
		<% { %>        
        /// 
		/// 创建<%=ClearPrefix(ViewName.Name) %>数据层接口。
		/// 
		public static I<%=ClearPrefix(ViewName.Name) %> Create<%=ClearPrefix(ViewName.Name) %>()
		{
			string ClassNamespace = AssemblyPath +".<%=ClearPrefix(ViewName.Name) %>";
			object objType=CreateObject(AssemblyPath,ClassNamespace);
			return (I<%=ClearPrefix(ViewName.Name) %>)objType;
		}         
		<% } %>
    }            
}