`
redsoft
  • 浏览: 6303 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

基于asp.net的Web开发架构探索

    博客分类:
  • .Net
阅读更多
问题由来

最近在研究适合团队开发的web架构解决方案,该架构即要适合分工协作又要有一定扩展性,适合不同的数据库需要,因此我查阅了一些资料,初步构想出了一套架构,请各位多多指教。



探索

web开发架构最经典莫过于三层架构,表示层、逻辑层、数据处理层。

数据访问层:其功能主要是负责数据库的访问。

业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关。

表示层:是系统的UI部分,负责使用者与整个系统的交互。理想的状态是表示层不应包括系统的业务逻辑。

这些是经典的解释,如果要适合不同的数据库则需要加入工厂模式,里面用面向接口的方式进行多态调用。是不是这有点像petshop了。所以架构的初步设想是这样:



下面以获取用户信息为例,简述这个架构的流程:(以下为类似petshop的经典做法,了解的可以略过)

step 1 、首先我们应该建立项目所需的实体模型,在这里新建用户信息的实体模式,UserInfo.cs。该类保存在Model项目里。

step 2 、我们再将项目的单元功能写到相关的接口中,这里以获取用户信息功能为例。在IDAL项目里新建IUser接口。

        //根据用户ID获取用户信息
        UserInfo GetUserById(int userId);

step 3、完成了接口,我们就要实现它,现在我们用sqlserver、oracle两种数据库访问方式来实现它。以下是SqlserverDAL中User类对接口的现实:

public class User:IUser
    {

       
        public UserInfo GetUserById(int userId)
        {
         //实现操作          

        }

    }

OracleDAL中现实方式类似。。。。

step 4、在此数据库访问层应该就基本写好了,下面应该给逻辑层调用了,但是两种实现方式怎么调用呢,或者说怎么有选择的调用它呢,petshop是这样处理的,在DALFactory中的DataAccess类,利用反射载入程序集从而实例化所需要的类:


        private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
        public static IUser CreateUser()
        { 

            string className = path + ".User";
            return (IUser)Assembly.Load(path).CreateInstance(className);

        }

至于要选择哪个数据库访问层,在配置文件里配置一下WebDAL。如:<add key="WebDAL" value="SQLServerDAL"/>。

这样就基本解决了逻辑层和数据访问层的耦合。

step 5、下面就该写逻辑层了,在BLL里面创建User.cs类。大致如下:

public class User
   {
       private static readonly IUser dal = DALFactory.DataAccess.CreateUser();

       public UserInfo GetUserInfo(int userId) {
            return dal.GetUserById(userId);
        }

   }

是不是觉得BLL毫无意义,因为它只是对数据访问层方法的简单调用,但并不是这样的,这里只有一个简单的事例,在实际项目中一个BLL里面处理的可能是一个非常复杂的逻辑,而这个复杂逻辑的结果才提供给表示层显示。

step 6、最后是表示层,好像没什么可说的,把从BLL取出来的数据绑定到你的页面就行了。

以上是仿petshop的架构设计,看起来没什么质疑的地方,毕竟是微软的经典案例。你可能抱怨的地方有两点,一是层是不是有点多,关系过于复杂;二如果我需要改变或增加一个数据库字段,那不是会很痛苦,因为要节联修改。这两个问题,我都没办法解决,一如果说过于层过于多而繁琐,那么下面我写的好像更为复杂,原谅。。。。二、鄙人觉得凡是分层开发,只要以数据库字段为依据的建立实体模型,都会存在节联修改的问题。除非全部用DataTable,那么在BLL、表示层调用的时候并不知道DataTable到底装有什么,这样无疑更加了调用的不便利。关于减少节联修改的问题,如有解决方法的请指教。

对以上架构的修改

我重点分析了以上架构的数据访问工厂的设计部分,即DALFactory中的DataAccess类。在此类中,实现了对不同数据库访问层的调用

。但如果现在有一个项目,里面有sqlserver又有oracle的现实,我们是不是要这样做:

private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];//对sqlserver数据库访问层的调用

private static readonly string path2 = ConfigurationManager.AppSettings["WebDAL2"];//对oracel数据库访问层的调用

        public static IUser CreateUser()
        { 

            string className = path + ".User";
            return (IUser)Assembly.Load(path).CreateInstance(className);

        }

        public static IOrder CreateOrder()
        { 

            string className = path2 + ".Order";
            return (IUser)Assembly.Load(path2).CreateInstance(className);

        }

如果要创建其他的访问类,我们还要写CreateProduct(),CreateArticle,CreateMenu。。。。。那么这样的类会很繁琐,我们能不能

只做一个方法,其他的工作只需要开发人员通过配置文件来完成呢。我的解决方案有两个:

一、Spring.net

这个东西就是专门用来解耦合的,我们将它的相关程序集加载到DALFactory中,于是在DataAccess中,我们可以做:

private static readonly string configPath = HttpContext.Current.Request.PhysicalApplicationPath +

ConfigurationManager.AppSettings["objectconfig"];//这是spring.net的对象配置文件在服务器上的物理位置
        public static T CreateObject<T>()
        {

            IResource rs = new FileSystemResource(configPath);
            IObjectFactory factory = new XmlObjectFactory(rs);
            string id = typeof(T).FullName;
            return (T)factory.GetObject(id);

}

这里我们传入一个泛型,让spring.net在它的对象配置文件里面找到该类型的程序集并加载,创建出对应的对象。objectconfig文件

大致如下:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.net
http://www.springframework.net/xsd/spring-objects.xsd">

<object id="IDAL.IUser" type="SQLServerDAL.Function"></object>

</objects>

这样在BLL 就这样调用

private static readonly IUser dal = EtourAF.Shared.DALFactory.DataAccess.CreateObject<IUser>();

这样开发人员如果要加入一个对象就在object-config中加一段相关配置就行了。嘿嘿,这就变成了petshop+spring.net了,YY无极限。。。。

二、也是用反射

这里我们只是用了一个键值对的方式,照例在配置文件里配置相应的接口和对象,只是我们把他配置到了web.config当中:

<add key="IDAL.IUser" value="SQLServerDAL.Function" />

在DataAccess中,我们就这样写:

public static T CreateObject<T>()
        {
            string interfaceFullName = typeof(T).FullName;
            string className = ConfigurationManager.AppSettings[interfaceFullName];
            string nameSpace = className.Substring(0, className.LastIndexOf("."));
            return (T)Assembly.Load(nameSpace).CreateInstance(className);
        }

可能有人说

string nameSpace = className.Substring(0, className.LastIndexOf("."));
这里这个截取是不是觉得有点硬,我现在也只想到这个办法,但绝对不会有问题的。

好了,这些大概就是鄙人这两天的有些收获,请指教。
0
0
分享到:
评论

相关推荐

    ASP.NET网站开发架构指南

    本篇文章将深入探讨ASP.NET网站开发的三种常见架构:单层架构、双层架构和三层架构,并通过一个实际的留言板应用为例,帮助读者理解这些架构的设计理念和实现方式。 ### 单层架构 单层架构是最基础的架构形式,所有...

    基于c#的asp.net三层架构的博客系统

    【标题】:“基于C#的ASP.NET三层架构的博客系统” 在软件开发中,三层架构是一种常见的设计模式,尤其在企业级应用中被广泛应用。它将应用程序分为三个主要部分:表现层(UI)、业务逻辑层(BLL)和数据访问层...

    基于ASP.NET三层架构系统

    总结来说,"基于ASP.NET三层架构系统"是一个典型的Web应用开发案例,展示了如何通过ASP.NET平台,结合C#编程语言,利用JavaScript和CSS增强用户界面,以及采用三层架构实现模块化和高效率的系统设计。理解并掌握这种...

    基于ASP.NET三层架构的学生选课系统 源代码 毕业设计

    总结来说,这个基于ASP.NET三层架构的学生选课系统是一个综合性的Web应用实例,涵盖了用户界面设计、业务逻辑实现和数据库管理等多个方面,对于学习和理解Web开发技术具有很高的价值。同时,源代码的提供使得学习者...

    基于asp.net的web开发框架

    总之,基于ASP.NET的Web开发框架结合了三层架构和权限管理,为企业级Web应用提供了一个强大的基础。通过解压并研究这些文件,开发者可以深入理解框架的工作原理,并在此基础上快速开发出满足特定需求的业务功能。...

    ASP.NET Web开发学习实录光盘

    ASP.NET Core是跨平台的开源版本,它集成了许多现代Web开发的最佳实践,如依赖注入、中间件架构和跨平台支持。通过光盘中的项目,你可以了解到如何配置和使用ASP.NET Core来创建高性能的Web应用。 再者,数据库集成...

    ASP.NET web 开发示例

    ASP.NET Web 开发示例是针对使用微软的ASP.NET框架构建Web应用程序的一个实践教程。这个框架为开发人员提供了一个高效、安全且可扩展的环境,用于创建动态网页和Web应用程序。在本文中,我们将深入探讨ASP.NET Web...

    ASP.NET Web开发学习实录_源码

    ASP.NET Web开发是一种微软公司推出的用于构建Web应用程序的框架,它基于.NET Framework,提供了一种高效、可扩展的平台来创建动态网站、Web服务和Web应用程序。本学习实录源码着重介绍了如何利用ASP.NET进行Web开发...

    基于ASP.NET的Web应用系统架构探讨

    提出了一种基于ASP.NET开发方式的四层架构的Web应用系统构造思想。其基本内容是:将面向对象的UML建模与Web应用系统开发相结合,将整个系统分成适合ASP.NET开发方式的应用表示层、业务逻辑层、数据访问层和数据...

    ASP.NET WEB开发学习实录-----源码.rar

    ASP.NET Web开发是一种微软公司推出的用于构建Web应用程序的技术框架,它基于.NET Framework或.NET Core,提供了丰富的功能和工具,使得开发者能够快速、高效地构建动态、数据驱动的网站和应用程序。这个"ASP.NET ...

    ASP.NET web开发大全

    《ASP.NET Web开发大全》是一本深入探讨ASP.NET技术的指南,主要针对.NET 3.5框架。尽管此书基于较旧的版本,但其中所涵盖的基础知识和技术仍然具有广泛的实用价值,尤其对于初学者和那些希望巩固基础知识的开发者。...

    ASP.net三成架构

    ASP.NET三成架构是一种常见的软件设计模式,常用于构建可维护性和可扩展性较高的Web应用程序。...通过学习和实践ASP.NET的三成架构,开发者可以提升自己的专业技能,更好地应对复杂的Web开发挑战。

    ASP.NET三层架构

    走过Asp.net学习入门阶段后,真正开始着手开发一个Web项目时,才发现错综复杂的数据与关联根本就不是SqlDataSource和AccessDataSource数据源控件能简单解决的,而恰恰是被忽视了的一个ObjectDataSource数据源控件才...

    ASP.NET Web应用系统项目开发

    ASP.NET Web应用系统项目开发是基于微软的.NET框架构建高效、安全且可伸缩的Web应用程序的方法。在本文中,我们将深入探讨ASP.NET Web应用系统的架构、开发流程、主要技术及其实现细节。 首先,ASP.NET是.NET ...

    ASP.NET三层架构留言板源码

    ASP.NET三层架构留言本项目源码 学习了三层架构后,写的一个ASP.NET 三层架构留言本,数据库是SQL Server 2000. 很简单的一个留言板,学习三层的朋友可以看下.功能没有写太多,主要是练习一下怎样实现三层架构 因是...

    ASP.NET三层架构网站源代码

    ASP.NET三层架构是一种常见的软件开发模式,用于构建高效、可维护和可扩展的Web应用程序。在ASP.NET中,三层架构通常指的是数据访问层(DAL)、业务逻辑层(BLL)和表示层(UI)。这种架构将应用程序的不同部分分离...

    简单的asp.net三层架构学习代码

    ASP.NET 是微软公司开发的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的功能和工具,简化了Web应用的开发过程。这个“简单的asp.net三层架构学习代码”是一个很好的起点,对于想要...

    基于ASP.NET的网络相册管理系统_WEB管理系统_SQLServer数据库应用.rar

    【标题】中的“基于ASP.NET的网络相册管理系统”是一个使用ASP.NET技术开发的在线照片存储和管理的应用程序。ASP.NET是由微软推出的Web应用程序框架,它允许开发者构建动态、数据驱动的网站和Web应用程序。这个系统...

    基于ASP.NET的图书销售系统

    1. **ASP.NET架构**:ASP.NET基于.NET Framework,它提供了多种编程模型,如Web Forms、ASP.NET MVC、ASP.NET Web Pages和ASP.NET Core。在这个图书销售系统中,很可能是采用了Web Forms模型,该模型提供了一种与...

Global site tag (gtag.js) - Google Analytics