我有一個 .NET 5.0 Web 應用程式,它為每個端點實體化類。這些類實體化子類。除了我現在這樣做的方式之外,是否有更優雅或更有效的方法來從子實體訪問父實體資料?
舉個例子:
public class ComponentClass
{
private PageClass _page;
public ComponentClass(PageClass page)
{
_page = page;
}
public void ComponentMethod()
{
// Call the method from the parent instance
page.PageMethod();
}
}
public class PageClass
{
private ComponentClass _component;
public PageClass()
{
_component = new ComponentClass(this);
}
public async Task ProcessRequest(HttpContext context)
{
// Call the component's method
_component.ComponentMethod();
}
public void PageMethod()
{
// Do something here
}
}
具體來說,我試圖避免傳遞this給每個 ComponentClass 實體......
uj5u.com熱心網友回復:
如果要在父級上呼叫方法,則有兩種選擇。第一種是將父級的參考傳遞給子級。沒有辦法解決這個問題,一個物件無法知道它是從哪個物件參考的。事實上,它可以被多個父物件參考。
更好的解決方案是使用事件。這樣子級永遠不會知道父級的任何資訊,并且可以發出任何數量的組件都可以訂閱的事件。有關活動的更多詳細資訊,請參見此處。例如,您的組件可能如下所示:
public class Component
{
public event EventHandler Tick;
public void DoSomething()
{
EventHandler handler = Tick;
handler?.Invoke(this, new EventArgs());
}
}
還有你的 PageClass:
public class PageClass
{
public Component _component { get; set; }
public void Init()
{
_component = new Component();
_component.Tick = Component_Tick;
}
public void MakeComponentTick()
{
// This method is just for testing, it's likely this would be triggered by user input
_component.DoSomething();
}
private void Component_Tick(object sender, EventArgs e)
{
Console.WriteLine("Component ticked!");
}
}
uj5u.com熱心網友回復:
為了使這些類松散耦合并允許組合,我將創建幾個建構式和一個特殊的分配方法。在最短的變體中,您可以在一行代碼中創建兩個類,并且您可以選擇第一個創建哪個類
void Main()
{
var page = new PageClass();
page.ProcessRequest();
//or
var component = new ComponentClass();
component.ComponentMethod();
}
組件類
public class ComponentClass
{
private PageClass _page;
public void AssignParent(PageClass page)
{
_page = page;
}
public ComponentClass(PageClass page)
{
AssignParent(page);
}
public ComponentClass(bool assignParent = true)
{
if (assignParent) AssignParent(new PageClass(false));
}
public void ComponentMethod()
{
// Call the method from the parent instance
_page.PageMethod();
}
}
頁面類
public class PageClass
{
private ComponentClass _component;
public PageClass(ComponentClass component)
{
AssignParent(component);
}
public PageClass(bool assignParent=true)
{
if(assignParent) AssignParent(new ComponentClass(false));
}
public void AssignParent(ComponentClass component)
{
_component = component;
_component.AssignParent(this);
}
public void ProcessRequest()
{
// Call the component's method
_component.ComponentMethod();
}
public void PageMethod()
{
// Do something here
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/360546.html
標籤:C# 。网 asp.net核心 .net-5 c#-9.0
上一篇:將字典值分組到C#中的物件中
