设计用于将UI与数据访问分离的ascx用户控件的“最佳实践”是什么?我的用户控制是否应该像我的项目一样使用3层架构,还是可以从用户控件中进行数据访问?
答案 0 :(得分:2)
您永远不应该从用户控件访问数据库。您应该创建一个用于访问数据库的类,应用程序中的所有内容都应该使用该类。基本上,类中的方法将是存储过程调用的包装器,但应用程序(以及用户控件)看到的所有方法都是具有所需参数的方法。从应用程序的角度来看,不了解数据库。这使您可以在不更改应用程序的情况下对数据库进行更改。
此链接可能会对您有所帮助:
答案 1 :(得分:1)
现在重要的是项目的简单性或复杂性,至少应将所有项目分为表示层,业务层和数据层。在任何给定时间,三者中的任何一个都可以改变而不影响其他人。
用户控件是表示层的一部分,它应该向业务层提供数据和用户操作,而业务层又解释数据和那些操作以做出决策。如有必要,业务层将调用数据层。反过来,数据层将处理与数据库/源文件的所有通信。
将三者分开并将它们分开并不难。
答案 2 :(得分:0)
我肯定会建议从某种业务层访问数据。 UI永远不应该直接访问数据库。
答案 3 :(得分:0)
这就是我项目中的内容。
1。) Application.Infrastructure
2。) Application.DataModel
3。) Application.DataAccess
4。) Application.DomainObjects
5.。 Application.BusinessLayer
6。) Application.WebClient 或 Application.WindowsClient
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层解决方案:数据,然后是其他所有内容。对于更复杂的项目,您需要将其他所有内容都抽象出来,并将其抽象为表示,逻辑和数据。数据也可以分为数据访问和数据模型层。