65.9K
CodeProject 正在变化。 阅读更多。
Home

在开发基于属性的服务器对象时使用对象创建-上下文

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2009年11月6日

CPOL

8分钟阅读

viewsIcon

20515

downloadIcon

212

使用通用的业务逻辑库创建 Windows 和 Web 应用程序。

Sample Image

目标

本文介绍了一种开发面向对象/面向方面应用程序的方法,该方法关注对象的定位方面(此处称为对象创建上下文),并展示了它如何减少开发时间、成本和资源,同时提高产品的期望质量。

引言

本文中的概念验证原型仅对持久化介质(XML 文件)中的数据进行用户身份验证。用户可以将用户名和密码提交给业务层中的 AuthenticationBiz 对象,该对象会检查当前登录用户的身份验证状态。AuthenticationBiz 对象在页面的 HttpSession 上下文中被实例化,以便通过 Framework.Core.Web.UI.dll 中定义的 Web Context Provider 来维护每次回发的用户凭据。在深入探讨细节之前,我建议您下载上面提到的概念验证原型示例,在 Visual Studio .NET 环境中执行它,并粗略查看用各种层(特别是嵌套在用户界面层中的业务对象)编写的代码。

背景

为了理解概念验证原型示例,了解使用 HttpSession 和 HttpApplication 等应用程序服务器对象进行 Web 应用程序开发的基本知识非常有用。

对象创建上下文属性概念

任何对象都位于一个可以被视为该对象属性的上下文中,并且根据主题可以被不同地描述。例如:如果我们想在奥林匹克比赛(主题)中描述一名游泳运动员(对象),那么主办国的特定游泳池将标识他的位置(属性)。如果您在上述示例中将主题更改为度假,那么主办国的特定海滩就可以标识他的位置(属性)。

考虑一个简单的文字处理应用程序(对象)在操作系统(主题)中;计算机的 RAM 或硬盘可以被识别为应用程序的位置(属性)。有人可能会问;对象是在 RAM 中还是在硬盘中创建的?哪个是该对象的上下文属性?它可以是其中一个或两者!实际上,上下文属性标识了对象在实例化时的默认位置。

例如,在 Microsoft Windows 操作系统(主题)中,记事本(对象)是在操作系统分配的虚拟内存中创建的(几乎所有 Windows 应用程序的默认属性)。在软件开发中,应用程序业务层中的对象可以根据主题拥有各种创建上下文属性。例如:用户访问检查(主题)中的身份验证业务对象可以持有当前用户会话(属性)的凭据,而授权业务对象可以持有所有用户会话(整个应用程序)的资源访问角色权限表。

对象创建上下文属性用法

在面向对象编程语言中,我们通常不会关注对象在系统中的位置,即使关注了,那对象可能也不在堆或栈中。这是完全可以的,也是对象的默认创建上下文属性,但如果我们希望对象在不同的上下文(如 HttpSession 或 Remoting 中的 Singleton)中创建,那么我们就需要编写大量代码并应用各种设置。使用对象创建上下文属性,一个对象可以通过一个属性来标识其默认创建上下文。例如:一个具有 ContextCreation.Session 属性的对象(如身份验证业务对象)将使用 CreationFactory 和适当的 Context Creation Provider 在页面的 HttpSession 中实例化。

本文中包含的概念验证示例介绍了一种简单而实用的方法,使程序员免于 Web 应用程序开发的“状态管理”难题。对象创建上下文可用于实现框架的业务逻辑,以创建支持 Windows 和 Web 界面的应用程序,实现最大的代码重用和最小的精力投入。

概念验证示例应用程序框架中的业务对象使用此方法来表示在开发 Web 应用程序时使用对象创建上下文的效率。业务类(例如:订单管理、用户身份验证)位于单独的库(.NET 程序集)中,并且可以用于 Windows 和 Web 应用程序。业务类的上下文属性标识了它们可以被实例化的位置。在示例(如所有多层应用程序)中,每个水平层都依赖于其下层,并为上层提供服务。这意味着,水平应用程序层不能(也不应该)在没有其下层存在的情况下使用,但可以为零个或多个上层使用者提供服务。

概念验证示例采用主流的三层应用程序架构,侧重于业务层:业务层(BL)为用户界面层(UI)提供服务,当然也可以监听来自 UI 层的传入事件。BL 还消耗数据访问层(DAL)的服务,并可以为底层引发事件。

在 Web 应用程序中维护对象状态是一项艰巨的任务,需要使用服务器对象和/或 Cookie 进行大量手动工作。为了简化 Web 应用程序开发,让开发人员专注于应用程序的业务需求,而不是状态管理问题,业务层中的业务对象可以被创建并维护在服务器对象(如 HttpSession、HttpApplication)中,这样只要会话有效,每次回发时都可以访问它们。该示例将业务对象维护在页面上下文的服务器对象中。

Using the Code

本文提供的示例旨在阐明对象创建上下文理论及其用法。概念验证原型演示包含一个身份验证机制,用于将用户凭据持久化到 Session 中,以及一系列实现 Web 和 Windows 应用程序对象创建上下文的核心框架库。核心框架由以下库组成:

  1. Framework.Core.Business.dll:业务基类、业务异常、业务工厂和业务事件。
  2. Framework.Core.Common.dll:一个通用异常,是业务异常和 UI 异常的基础。
  3. Framework.Core.Web.UI.dll:Session 和 Application 服务器对象的上下文提供程序类。
  4. Framework.Core.Win.UI.dll:上下文提供程序,对 Session 和 Application 创建上下文(CreationContextAttribute)的行为类似。

任何使用核心框架的程序都应在其相应的层中包含核心库。例如:安全演示包含业务、通用和 UI 层,其业务层应包含 Core.Business 和 Core.Common 库。通用层应包含 Core.Common,而 Web UI 层应包含 Core.Web.UI 以及其他两个核心库。

通用层可以包含任何实体类型。在安全演示中,我使用了一个数据库(SecurityDataSet.xsd)。

在业务层中,每个业务对象可以根据其主题拥有自己的创建上下文。在安全演示中

  • UsersBiz 类(对象)的一个实例在服务器应用程序内存(创建上下文)中创建,并在所有用户的每次页面回发(主题)时保留在服务器内存中。因此,所有用户凭据(SecurityDataSet_securityDataSet)都将保存在服务器内存中,而不是在每次身份验证过程中从数据库中获取。
  • [CreationContext(CreationContextLocation.Application)]
    public class UsersBiz : BizBase
    {
        private const string UsersDataFile = "Users.xml";
        private SecurityDataSet _securityDataSet = null;
        public EnumerableRowCollection<SecurityDataSet.SYS_tblUserRow> Users…
    }
  • AuthenticationBiz 类(对象)的一个实例在服务器会话内存(创建上下文)中创建,并在当前用户的每次页面回发(主题)时保留在服务器内存中。因此,用户凭据信息(SYS_tblUserRow_credentials)将在每次会话的回发中可用。请注意,_usersBiz 对象是使用 CreateBusiness 方法创建的,而不是使用 new 语言关键字。
  • [CreationContext(CreationContextLocation.Session)]
    public class AuthenticationBiz : BizBase
    {
        private SecurityDataSet.SYS_tblUserRow _credentials;
        private UsersBiz _usersBiz;
        public AuthenticationBiz(IBizContextProvider<BizBase> sessionBizCtx, 
               IBizContextProvider<BizBase> applicationBizCtx)
            : base(sessionBizCtx, applicationBizCtx)
        {
            _usersBiz = CreateBusiness<UsersBiz>();
        }
        public bool Login(string username, string password)…
        public bool Logout()…
        public bool IsAuthenticated…
    }

    用户界面(Web 或 Windows)可以使用 CreateBusiness<BizBase> 方法创建业务对象的实例,类似于在业务层中创建另一个业务对象。根据创建上下文属性,对象可以在 HttpSession 或 HttpApplication 内存中创建。以下是 Web 应用程序的代码隐藏。对于基于 Web 的用户界面,该类应继承自 PageBase 类。

    publicpartial class FrmLogin : PageBase
    {
        private AuthenticationBiz _authentication;
        protected void Page_Load(object sender, EventArgs e)
        {
            _authentication = CreateBusiness<AuthenticationBiz>();
        }
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                if (_authentication.Login(txtUserName.Text, txtPassword.Text))
                    ShowMessage("Login Successfully.", Color.Green);
            }
            catch (BizException bizException)
            {
                ShowMessage(bizException.Message, Color.Red);
            }
        }
        protected void btnLogout_Click(object sender, EventArgs e)
        {
            try
            {
                if (_authentication.Logout())
                    ShowMessage("Logout Successfully.", Color.Blue);
            }
            catch (BizException bizException)
            {
                ShowMessage(bizException.Message, Color.Red);
            }
        }
        protected void btnAuthenticated_Click(object sender, EventArgs e)
        {
            if (_authentication.IsAuthenticated)
                ShowMessage("User Is Authenticated.", Color.Green);
            else
                ShowMessage("User Is Not Authenticated.", Color.Red);
        }
    }

    对于 Windows Forms 用户界面,该类应继承自 FormBase 类。

    publicpartialclassFrmLogin : FormBase
    {
        private AuthenticationBiz _authentication;
        public FrmLogin()
        {
            InitializeComponent();
            _authentication = CreateBusiness<AuthenticationBiz>();
        }
        private void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                if (_authentication.Login(txtUserName.Text, txtPassword.Text))
                    ShowMessage("Login Successfully.", Color.Green);
            }
            catch (BizException bizException)
            {
                ShowMessage(bizException.Message, Color.Red);
            }
        }
        private void btnLogout_Click(object sender, EventArgs e)
        {
            try
            {
                if (_authentication.Logout())
                    ShowMessage("Logout Successfully.", Color.Blue);
            }
            catch (BizException bizException)
            {
                ShowMessage(bizException.Message, Color.Red);
            }
        }
        private void btnIsAuthenticated_Click(object sender, EventArgs e)
        {
            if (_authentication.IsAuthenticated)
                ShowMessage("User Is Authenticated.", Color.Green);
            else
                ShowMessage("User Is Not Authenticated.", Color.Red);
        }
    }

    正如您所见,业务对象的实例化和使用对于 Windows 和 Web 用户界面来说是相同的。

结论

在应用程序中使用对象创建上下文属性可以减少开发人员编写代码以识别对象在系统中的位置的工作量。对象位置可以在设计时确定一次,并在开发应用程序时多次使用。这意味着,投入更少的时间开发应用程序,并通过提取将对象放置到其上下文位置的复杂性来提高质量。

关注点

对象创建上下文可以在面向服务架构(SOA)应用程序中用作将处理分发到不同位置的基础。这意味着,对象实例化请求可以发送到企业服务总线(ESB),ESB 可以在由对象创建上下文属性标识的位置提供请求对象的实例。

历史

版本 1.0.0.0。

在开发基于属性的服务器对象中使用对象创建上下文 - CodeProject - 代码之家
© . All rights reserved.