如何允许集合中的项将状态更改通知其父项
本文关键字:通知 状态 何允许 集合 | 更新日期: 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种不同的方法
- 一个日志类被传递到链(感觉像一个)绷带,作为其他问题,除了日志记录将不会出来可以访问父节点)
- 直接将父级传递给子级
- 事件. .事情似乎是该走的路,但我没什么他们的实施经验,所以需要确保他们都是正确的方法,然后我再开始!
我想要"在链上"通信的原因目前是出于日志记录的目的。如果我想记录说"ProductCodeXYX => Removed Large From AttributeA",我必须从AttributeA类内部获得产品的名称(我目前使用静态类,它是双重加载数据)。
事件呢?子进程可以在其属性被修改时引发事件,而父进程可以处理它。这样,子节点就不需要有父节点的引用了。