为我的对象实现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 ();

为我的对象实现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,但在一起,所以你很容易找到它们,并在一个轻松的更新,如果你添加或更改字段