代码之家  ›  专栏  ›  技术社区  ›  Dav.id

数据访问的C OO设计示例

  •  1
  • Dav.id  · 技术社区  · 15 年前

    我正在使用MS Enterprise Library 5.0(数据访问块)作为应用程序的主数据层。

    虽然我了解OO的基本知识(是的,我需要不断学习-不断地!)我试图通过理解在哪里/为什么/如何使用好的设计来工作,即不必重复代码等,并且仍然试图保持代码的简单易读性,当然还有调试。

    首先,我有以下类和默认/示例方法: (P.S:db/proc的返回值是xml)

    public class ajaxget
    {
        public enum outputType : int { JSON = 0, XML = 1 }
    
        public static string getMemberContacts(string sStartsWith, string sEndswith, outputType eOT)
        {
            //  Get the associated members based upon the criteria
            Database db = DatabaseFactory.CreateDatabase("MyDatabase");
            DbCommand cmd = db.GetStoredProcCommand("get_memberContactsXML");
            db.AddInParameter(cmd, "@memberID", DbType.Int64, Convert.ToInt64(sID));
            db.AddInParameter(cmd, "@startsWith1", DbType.String, sStartsWith);
            db.AddInParameter(cmd, "@startsWith2", DbType.String, sEndswith);
            IDataReader dr = db.ExecuteReader(cmd);
            StringBuilder sb = new StringBuilder();
            while (dr.Read())
            {
                sb.Append(dr.GetValue(0));
            }
    
            //  Clean up
            dr.Close();
            dr.Dispose();
            cmd.Dispose();
    
            //  What format to return?
            if (eOT == outputType.XML)
            {
                return sb.ToString();
            }
            if (eOT == outputType.JSON)
            {
                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(sb.ToString());
                return JsonConvert.SerializeXmlNode(xdoc);
            }
        }
    }
    

    所以…到目前为止还很基本。我只是想在这里建立一个模板,说明如何继续使用say more“getmembercontacts”方法。也就是说,我应该创建一个通用的“get”方法,这是一个虚拟方法,并重写参数吗?我知道这听起来是很好的补救措施。我想是学习的一部分。

    总之,我尝试重新使用“get”方法,其中参数/proc名称明显不同,但是实际返回值(在本例中是XML,因此连接返回的XML块的while/append部分)需要相同,即返回可以保留为XML,或者如果提供了JSON,则可以返回。

    我知道这是非常基本的东西/概念,但任何建议/想法都会得到感激!

    戴维。

    ---编辑---

    为了展示SQL 2008 XML部分,我对不直接从SQL返回XML的评论感到好奇,我再次理解,获取原始数据以便以不同的方式使用它是一件好事,但在我的例子中,我的所有前端框架都使用XML或JSON(顺便说一下,JS框架是www.dhtmlx.com,它已经真棒!

    所以SQL 2008的过程是:

    CREATE PROCEDURE [dbo].[get_messagesForMemberXMLByID]
        @memberID as bigint=null,
        @days as int=-7
    AS
    BEGIN
        SET NOCOUNT ON;
    
        /* Setup the starting point (in the past) from when we wish to select the messages */
        Declare @startDate datetime
        set @startDate = DateAdd(d,@days, getdate())
    
        SELECT inboxID as "@id", convert(varchar(12),messageCreated,13) as messageCreated, convert(varchar(8), messageCreated,108) as messageCreatedTime, subject,message, messageOpened, messageFrom, messageFromID
        FROM bizzbox
        WHERE memberID = @memberID
        AND convert(char(8), messageCreated, 112) BETWEEN convert(char(8), @startDate,112) AND convert(char(8), getdate(), 112)
        ORDER BY messageCreated desc
        FOR XML PATH('row'), ROOT('rows')
    END
    

    输出回缩为:

    <rows>
      <row id="1">
        <messageCreated>31 Oct 2010 </messageCreated>
        <messageCreatedTime>21:27:32</messageCreatedTime>
        <subject>Testing 123</subject>
        <message>Wibble Bibble!</message>
        <messageFrom>David</messageFrom>
        <messageFromID>7</messageFromID>
      </row>
    </rows>
    

    …这正是我需要为前端格式化数据的方式。

    我可以看到为什么不使用这个方法的原因——例如,如果我使用另一个框架或者需要直接的数据表中的数据怎么办。我想我可以有一个参数变量以XML或直接表格形式输出。或者我敢说两个程序……但同样,有兴趣听到这些评论…

    再次感谢所有的意见-非常感谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   sheikhjabootie    15 年前

    StringBuilder sb = new StringBuilder(); 
    
    using(DbCommand cmd = db.GetStoredProcCommand("get_memberContactsXML"))
    {
        db.AddInParameter(cmd, "@memberID", DbType.Int64, Convert.ToInt64(sID)); 
        db.AddInParameter(cmd, "@startsWith1", DbType.String, sStartsWith); 
        db.AddInParameter(cmd, "@startsWith2", DbType.String, sEndswith); 
        using(IDataReader dr = db.ExecuteReader(cmd))
        { 
            while (dr.Read()) 
            { 
                sb.Append(dr.GetValue(0)); 
            } 
        }
    }
    

    public abstract class DataAccessLayerBase
    {
        protected string GetXml(string storedProcedureName, OutputType outputType, params Tuple<string,DBType,object>[] parameters)
        {
            StringBuilder sb = new StringBuilder();
    
            //  Get the associated members based upon the criteria  
            Database db = DatabaseFactory.CreateDatabase("MyDatabase");  
    
            using(DbCommand cmd = db.GetStoredProcCommand(storedProcedureName))
            {
                foreach(var parameter in parameters)
                {
                    db.AddInParameter(cmd, parameter.Item1, parameter.Item2, parameter.Item3);
                }
    
                using(IDataReader dr = db.ExecuteReader(cmd))
                {
                    while (dr.Read())  
                    {  
                        sb.Append(dr.GetValue(0));  
                    }  
                }      
    
                switch(outputType)
                {
                    case OutputType.Xml:
                        return sb.ToString();  
                    case OutputType.Json:
                        XmlDocument xdoc = new XmlDocument();  
                        xdoc.LoadXml(sb.ToString());  
                        return JsonConvert.SerializeXmlNode(xdoc);  
                    default:
                        throw new NotSupportedException(); // Some sort of error.
                }
            }
        } 
    }
    

    public class MemberContactsDal : DataAccessLayerBase
    {
        public string GetMemberContacts(long memberID, string startsWith, string endsWith, OutputType outputType)
        {
            // Call the method in the base class to handle all of the parsing.
            return GetXml(
                "get_memberContactsXML", 
                outputType, 
                new Tuple("@memberID", DBType.Int64, memberID ), 
                new Tuple("@startsWith1", DBType.String, startsWith), 
                new Tuple("@startsWith2", DBType.String, endsWith)
            );
        }
    }
    

        2
  •  1
  •   Shiv Kumar    15 年前

    public static List<MemberContact> GetMemberContacts(int memberId)
    

    推荐文章