如何允许集合中的项将状态更改通知其父项

本文关键字:通知 状态 何允许 集合 | 更新日期: 2023-09-27 18:14:25

我目前遇到一个问题,即在不传递父元素的引用的情况下,集合中的子元素如何在"链上"进行通信。

当我开始这个项目时,我想让孩子们独立于他们的父母。但是现在我遇到了一些问题当我想记录事件的

我准备了一个基本的例子来说明我下面要处理的结构。

class Product
{
    public int ProductId { get; set; }
    public string ProductCode { get; set; }
    /**
     * Note: in the application this List is actaually a seperate class 
     * for loading / saving of attributes.
     **/
    public List<AttributeA> AttributeACollection = new List<AttributeA>();
    public void LoadById(int productId)
    {
        /** 
         * Load all product data including filling AttributeACollection
         **/
    }
    public void Save()
    {
        /**
         * Goes through AtrributeACollection 
         * checks for new / edited / deleted AttributeA's
         * Saves to database 
         **/
    }
    public static string GetProductCodeById(int productId) 
    { 
        /**
         * Return product name by searching the product table using product ID.
         **/
    }
}
class AttributeA
{
    /** 
     * The database id of the product
     * this attribute is attached to 
     **/
    public int ProductId { get; set; }
    /**
     * The id of the of AttributesA variation 
     * (e.g. if the attribute was size the variation 
     * id might point to "Large" 
     **/
    public int AttribiteId { get; set; }
    /**
     * The name of the selected variation for this attribute 
     **/
    public string AttributeName {get;set;}
    /**
     * The database id of the relation 
     * between product Id and Attribute id
     **/
    public int VariationId { get; set; }
    public void LoadById(int variationId) { }
    public void LoadByProductIdAndAttributeId(int productId, int attributeId) { }
    public void Save() 
    {
        /**
         * If I want to log a change here I have to call
         * the static Product.GetProductCodeById to log with the
         * product code. 
         **/
    }
    public void Delete() {}
}

虽然在上面的例子中传递父类的引用很容易,但在实际的应用程序中,属性有属性列表,我不觉得拥有一个永无止境的"parent"列表是正确的方式。

我已经研究了3种不同的方法

  1. 一个日志类被传递到链(感觉像一个)绷带,作为其他问题,除了日志记录将不会出来可以访问父节点)
  2. 直接将父级传递给子级
  3. 事件. .事情似乎是该走的路,但我没什么他们的实施经验,所以需要确保他们都是正确的方法,然后我再开始!

我想要"在链上"通信的原因目前是出于日志记录的目的。如果我想记录说"ProductCodeXYX => Removed Large From AttributeA",我必须从AttributeA类内部获得产品的名称(我目前使用静态类,它是双重加载数据)。

如何允许集合中的项将状态更改通知其父项

事件呢?子进程可以在其属性被修改时引发事件,而父进程可以处理它。这样,子节点就不需要有父节点的引用了。