zoukankan      html  css  js  c++  java
  • C#CustomAttribute和泛型约束 应用于经典数据处理适配

    最近在做个小东西,刚好学习下mvc,习惯了webform,一下子入手mvc,还真不习惯,积累的很多webform资源和经验没几个能用上,不过对未接触过的东西还是蛮有兴趣的。在考虑用数据层linqtosql结合mvc还是用通用数据处理对象,还是选择通用数据处理对象感觉更轻量级和实用。

    该通用数据处理对象,我只实现个sqlserver的,反正自己的东西一般用这个,免得再来个工厂麻烦。

    实现方式简单罗列下:

     1、数据处理适配器的泛型T,加约束继承接口,需要实现PrimaryKeyName和实体索引,约束需要可以实例化即new();

    2、实现表信息属性类,继承Attribute,可以作为CustomAttribute,在需要用的类的类名申明的上面以方括号的形式给该用户属性赋值。
    方便使用数据库适配器与实体的解耦合,直接传递泛型对象实现所有其增删改查的数据操作功能。

    3、数据处理适配器里面解析CustomAttribute出来获取表名以及字段信息,就方便进行select\update\insert等,完善查询的方法,可能有事务处理的再加上对应的事务处理重载方法。

    不知有没好建议和意见,欢迎指出。

    简单示例代码如下:
         public interface ITableModel
        {
            string PrimarkKeyName { get ; set; }
            object this [string name] { get; set ; }
        }
         public class TableInfoAttribute: Attribute
        {
            public string TableName { get; set; }
            public string [] Fileds { get; set; }
        }
        [ TableInfo(TableName = "ArticleCategories_TB" , Fileds = new string[] { "AutoID","ParentID" ,"CName", "Remark" })]
        public class ArticleCategoriesInfo : ITableModel
        {
            public int AutoID { get; set; }
            ......    

            public string PrimarkKeyName
            {
                get
                {
                    return "AutoID" ;
                }
                set
                {
                    PrimarkKeyName = value;
                }
            }

            public object this[ string name]
            {
                get
                {
                    switch (name.ToLower())
                    {   ......     }
                }
                set
                {
                    switch (name.ToLower())
                    {  ......     }
                }
            }
        }
    //数据处理适配器 请注意where后面的约束
    public class SqlDAL<T> where T:ITableModel ,new()
        { 
            private static TableInfoAttribute GetTableInfo()
            {
                Type tType = typeof (T);
              
                object[] objs = tType.GetCustomAttributes(false);
                TableInfoAttribute tableInfo = objs[1] as TableInfoAttribute;
                 return tableInfo;
            }
            public static T Select(int id)
            {
                T t = new T();
                TableInfoAttribute tableInfo = GetTableInfo();
                string sqlStr = string .Format("select * from {0} where {1}={2}",tableInfo.TableName,t.PrimarkKeyName,id);
                using (SqlDataReader idr = SqlHelper.ExecuteReader(ConnectionStr, CommandType.Text, sqlStr))
                {
                    while (idr.Read())
                    {
                        for (int i = 0; i < idr.FieldCount; i++)
                        {
                            t[tableInfo.Fileds[i]] = idr[tableInfo.Fileds[i]];
                        }
                    }
                }
                return t;
            } 
            public static void Update(T t)
            {
     
            }

            public static void Insert(T t)
            {

            }

            public static void Delete(T t)
            {

            }
     
            public static void Update(T t, SqlTransaction tran)
            {

            }
            public static void Insert(T t, SqlTransaction tran)
            {
     
            }
            public static void Delete(T t, SqlTransaction tran)
            {

            }
     
        }
  • 相关阅读:
    线程的同步之Synchronized的使用
    线程的优先级
    线程的状态和常用操作
    Eclipse设置代码模板Code Template
    Eclipse设置每行代码的长度
    Eclipse设置控制台字体
    Gradle 安装(Windows)
    DSL与GPL
    Windows 新增 Sublime Text3 右键快捷方式
    mvn install 上传 jar 包到Maven仓库
  • 原文地址:https://www.cnblogs.com/weikaishi/p/1935124.html
Copyright © 2011-2022 走看看