n层结构:最好的地方储存业务的对象?
-
18-09-2019 - |
题
说我有3层架构(UI、商业和数据)。通常,我的创建第4个项目,称为"模式"或"共同",以保持我的数据访问的目的和各个其他项目将利用这个项目。
现在我工作上的一个项目中,我的一些数据访问对象的方法,如Save()等,需要对数据的访问项目。因此,我将有一个圆形的参考,如果我试图使用该模型/共同的项目在数据项目。
在这种情况下,哪里是最好的地方,以保持数据访问的对象?我可以保持它在数据项目的本身,但然后我UI项目,该项目需要知道关于数据的访问对象,将需要访问的数据层,这是不好的。
解决方案
这是什么我在我的项目。
1.) 应用程序。基础设施
- 基类的所有象,业务目的收集、数据接入类和我的自定属性和公用设施以扩展方法,一般验证框架。这确定总体行为组织的我的最终决定。净的应用程序。
2.) 应用程序。DataModel
- 输入的数据集,该数据库。
- Tableadapter扩展,以纳入交易以及其他功能我可能需要的。
3.) 应用程序。数据访问
- 数据接入课程。
- 实际的地方行动数据库查询使用的潜在输入数据集。
4.) 应用程序。DomainObjects
- 业务的目的和商业目的收藏品。
- 枚举。
5.) 应用程序。BusinessLayer
- 提供管理课程可从介绍层。
- HttpHandlers.
- 我自己的网页基类。
- 更多的东西去这里..
6.) 应用程序。Web客户端 或 应用程序。WindowsClient
- 我的介绍层
- 需要引用的应用程序。BusinessLayer和应用程序。象.
应用程序。象是用于整个应用程序和他们的旅行在所有层,只要用填写冗[除应用程序。DataModel和应用程序。基础设施的]
我所有的查询只定义的应用程序。DataModel.
应用程序。数据访问返回,或者需要的业务对象的一部分的任何数据接入操作。业务对象的帮助下创建的反射特性。每个业务目标有一个属性映射目标表中的数据库和性在业务目标有属性的映射目标coloumn在各自的数据库表。
我的验证框架可以让我验证的各领域的帮助下指定的情况下.
我framrwork大量使用属性的自动多数的繁琐的任务就像测绘和验证。我也可以的新功能以新的方面的框架。
一样的业务对象是这样的我应用程序。
用户。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)
{
}
}
其他提示
我不认为你有你的n层完全正确。这听起来像你正在构建更多的2层系统。
在一个真正的3层项目,只有你的数据层被允许谈论到数据库。你有你的“模型”或“公共”的项目。这些项目的是的数据层。但是,在你偏离了是的只有的业务层应该被允许与他们交谈。您的演示文稿的代码不应该被允许交谈的数据层项目在所有。
N层进来时,你有多于3“层”,但同样的原理施放:每一层只知道如何使用(并且仅需要一个参考)它下面的一个,然后提供一个API,用于它上面的层。在我自己的项目,我把你的典型表现,业务层和数据层提供的业务和数据之间的第4个“翻译”层。这样,数据层可以返回通用的类型,如数据集,数据表,和DataRow和业务层的只有的具有强类型的业务对象方面的工作。翻译层的只有的通用数据对象和强类型对象之间转换。这种方式改变到传统层中的一个是不太可能需要在另一个的变化。
数据层应该存储信息方面的行列(也许使用类型的数据集,如果你喜欢的),如果使用一关系的后端。没有"业务对象"。
业务层应该利用你的"商务对象"。它可以有一个参考象的项目。
在摘要:
- UI已经提到的业务和获取的知识
- 业务具有参考文献,获取的知识和数据
希望这会有所帮助。
我有一个项目的BusinessObjects,服务器侧存储的映射(ORM)和相应的数据访问服务上它们暴露CRUD操作(和其他也喜欢GETALL)等
我建议建立并要在示范项目是什么接口,并实现在数据层定义。这样,所有的三(四?)项目可以使用这一定义,不知道它是如何实现的。
在我看来,只有业务层应该具有数据访问对象的知识。它应该使用它们进行数据操作,同时应用其自己的业务规则和逻辑,然后返回哑对象(例如数据传输对象)上述UI层。
您可以使用一些事情如 AutoMapper 到您的数据和业务对象之间的自动映射。
这真的取决于模式,如果你正在使用MVC(Front Controller模式),该模型是在该应用程序操作数据的特定于域的表现(通常与这样的一个ORM的帮助),我们使用数据项目此类。
模型不是数据访问对象,因此数据存取在一个不同的项目存储库的形式越大。服务业务规则和最后的Web项目。在这种方法中Data.dll在所有项目中引用。 该模型是像无所不在。
DATA(Domain Model) -> REPOSITORY(Data Access) -> SERVICE(Business Rules) -> WEB