在ascx用户控件中将UI与数据访问分开

时间:2009-12-23 16:08:20

标签: asp.net user-controls ascx

设计用于将UI与数据访问分离的ascx用户控件的“最佳实践”是什么?我的用户控制是否应该像我的项目一样使用3层架构,还是可以从用户控件中进行数据访问?

5 个答案:

答案 0 :(得分:2)

您永远不应该从用户控件访问数据库。您应该创建一个用于访问数据库的类,应用程序中的所有内容都应该使用该类。基本上,类中的方法将是存储过程调用的包装器,但应用程序(以及用户控件)看到的所有方法都是具有所需参数的方法。从应用程序的角度来看,不了解数据库。这使您可以在不更改应用程序的情况下对数据库进行更改。

此链接可能会对您有所帮助:

http://www.simple-talk.com/dotnet/.net-framework/.net-application-architecture-the-data-access-layer/

答案 1 :(得分:1)

现在重要的是项目的简单性或复杂性,至少应将所有项目分为表示层,业务层和数据层。在任何给定时间,三者中的任何一个都可以改变而不影响其他人。

用户控件是表示层的一部分,它应该向业务层提供数据和用户操作,而业务层又解释数据和那些操作以做出决策。如有必要,业务层将调用数据层。反过来,数据层将处理与数据库/源文件的所有通信。

将三者分开并将它们分开并不难。

答案 2 :(得分:0)

我肯定会建议从某种业务层访问数据。 UI永远不应该直接访问数据库。

  • 如果您的访问规则发生了变化,该怎么办?
  • 如果您的存储空间发生变化怎么办?
  • 您能确保每个UI控件都能够执行业务规则吗?

答案 3 :(得分:0)

这就是我项目中的内容。

1。) Application.Infrastructure

  • 所有业务对象,业务对象集合,数据访问类和我的自定义属性和实用程序的基类,作为扩展方法,通用验证框架。这决定了我最终的.net应用程序的整体行为组织。

2。) Application.DataModel

  • 数据库的类型化数据集。
  • TableAdapters扩展到包含我可能需要的交易和其他功能。

3。) Application.DataAccess

  • 数据访问类。
  • 使用基础类型化数据集查询数据库操作的实际位置。

4。) Application.DomainObjects

  • 业务对象和业务对象集合。
  • 枚举。

5.。 Application.BusinessLayer

  • 提供可从Presentation层访问的经理类。
  • HttpHandlers的。
  • 我自己的页面基类。
  • 更多的事情在这里..

6。) Application.WebClient Application.WindowsClient

  • 我的演示文稿图层
  • 从Application.BusinessLayer和Application.BusinessObjects。
  • 获取引用

Application.BusinessObjects在整个应用程序中使用,并且每当需要时它们都会遍历所有层[Application.DataModel和Application.Infrastructure]

我的所有查询都只定义了Application.DataModel。

Application.DataAccess返回或接受Business对象作为任何数据访问操作的一部分。业务对象是在反射属性的帮助下创建的。每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记。

我的验证框架允许我在指定的ValidationAttribute的帮助下验证每个字段。

我的framrwork大量使用Attributes来自动化大多数繁琐的任务,如映射和验证。我还可以将新功能作为框架中的新方面。

示例业务对象在我的应用程序中看起来像这样。

<强> User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

<强> BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}

答案 4 :(得分:0)

您至少需要一个2层解决方案:数据,然后是其他所有内容。对于更复杂的项目,您需要将其他所有内容都抽象出来,并将其抽象为表示,逻辑和数据。数据也可以分为数据访问和数据模型层。