为我的对象实现Save方法
本文关键字:Save 方法 实现 对象 我的 | 更新日期: 2023-09-27 18:07:21
我试图改进我的应用程序的设计,所以,而不是从表示层调用DataAccess层。我将尝试从我的BusinessObjects层中的对象实现一个保存方法。但我不确定如何通过图层传递对象或它的属性。例如,在我以前的设计中,我只是在表示层创建一个对象的实例,并分配它的属性,然后只需调用DataAccess方法将此信息保存在数据库中,并将对象作为参数传递,如图所示。
木豆public static void SaveObject(Object obj)
{
int id = obj.id;
string label = obj.label;
}
PL
Object obj = new Object();
obj.id = 1;
obj.label = "test";
DAL.SaveObject(obj);
但是我只想在我的PL
Object obj = new Object();
obj.id = 1;
obj.label = "test";
obj.SaveObject();
这可能吗?我的DAL会是什么样子呢?
编辑:解释我的需求
我现在将把我的代码建立在系统中一个非常重要的对象上。
BusinessEntitiesLayer使用BusinessLogic Layer
namespace BO.Cruises
{
public class Cruise
{
public int ID
{ get; set; }
public string Name
{ get; set; }
public int BrandID
{ get; set; }
public int ClassID
{ get; set; }
public int CountryID
{ get; set; }
public string ProfilePic
{ get; set; }
public bool Hide
{ get; set; }
public string Description
{ get; set; }
public int OfficialRate
{ get; set; }
public string DeckPlanPic
{ get; set; }
public string CabinsLayoutPic
{ get; set; }
public List<Itinerary> Itineraries
{ get; set; }
public List<StatisticFact> Statistics
{ get; set; }
public List<CabinRoomType> RoomTypesQuantities
{ get; set; }
public List<CabinFeature> CabinFeatures
{ get; set; }
public List<CruiseAmenity> Amenities
{ get; set; }
public List<CruiseService> Services
{ get; set; }
public List<CruiseEntertainment> Entertainment
{ get; set; }
public List<CustomerReview> CustomerReviews
{ get; set; }
}
}
BusinessLogicLayer使用DataAccessLayer
实际上,这一层是用来验证我的对象,然后调用DAL方法,但我现在没有实现任何验证,所以我只是用它来调用DAL方法。
public static void Save(object cruise)
{
CruisesDAL.Save(cruise);
}
DataAccessLayer试图引用BussinessEntities,但它给我循环依赖错误!
它应该接收对象并将其转换为Cruise实体
public static void Save(object cruise)
{
Cruise c = cruise as Cruise;
//access the object c properties and save them to the database
}
我的项目代码示例:
public static List<Cruise> GetCruisesList()
{
string commandText = "SELECT ID, Name + CASE Hide WHEN 1 Then ' (Hidden)' ELSE '' END AS Name FROM Cruises";
List<Cruise> cruises = new List<Cruise>();
Cruise cruise;
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
using (SqlCommand command = new SqlCommand(commandText, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
cruise = new Cruise();
cruise.ID = Convert.ToInt32(reader["ID"]);
cruise.Name = reader["Name"].ToString();
cruises.Add(cruise);
}
}
}
}
return cruises;
}
PresentationLayer使用BusinessEntities
输入控件(文本框,下拉列表等)
单击保存按钮时,我获取所有值,创建Cruise对象并调用Cruise. save ();
您应该避免将域模型与持久性逻辑混合在一起。上面给出的示例将构成一个紧密耦合解决方案。为了实现. saveobject(),您可以在BL中创建执行该工作的扩展方法。
*提单。
public static class ObjectPersistanceExtensions{
public static SaveObejct<T>(this IBaseEntity obj){
IObjectDal<T> _dal = AvailableSerices.Obtain<IObjectDal<T>>();
_dal.AddObject(obj);
_dal.Commit();
}
}
因此,通过这种方式,您仍然可以在不耦合域对象中的逻辑的情况下向域对象添加功能。
将对象本身传递给数据层通常有点古怪。相反,我建议您让对象与数据层对话,让数据层做自己的事情。
internal static class DataLayer {
public static bool Update(int id, string label) {
// Update your data tier
return success; // bool whether it succeeded or not
}
}
internal class BusinessObject {
public int ID {
get;
private set;
}
public string Label {
get;
set;
}
public bool Save() {
return DataLayer.Update(this.ID, this.Label); // return data layer success
}
}
这样做的原因是,您的数据层可能没有对业务对象的引用,因此不知道它是什么。您将无法传递对象本身。这是一个常见的场景,因为通常是业务对象程序集引用数据层程序集。
如果所有内容都在同一个程序集中,则上述内容不适用。但是,如果稍后您决定将数据层重构为其自己的模块(结果通常是这样,并且是良好的设计),则传递对象将中断,因为它将失去对业务对象的引用。
无论你用哪种方式,你都应该知道,如果你添加一个新的字段或成员,你将不得不更新你的对象和你的数据层。当你添加新内容时,这是给定的。
我可能会为此写一篇关于一些好的设计实践的博客,但这是我的建议。
如果您遵循此模式,您将在对象定义本身中拥有保存逻辑,因此当您从PL调用:
obj.SaveObject();
这将发生在对象本身:
public void SaveObject()
{
DAL.SaveObject(this);
}
和您的DAL保持与上面所示的相同。
这是一个设计问题,我不会把保存的逻辑放在对象内,但我会有一个BusinessManager或ObjectMapper从DAL读取并保存到DAL。
通常是一个很好的做法,读取或加载和保存在同一个地方,BusinessObject或BusinessManager,但在一起,所以你很容易找到它们,并在一个轻松的更新,如果你添加或更改字段