从 .NET 5.0 / C# 9.0 中的子实例访问父实例数据

Accessing parent instance data from child instances in .NET 5.0 / C# 9.0

我有一个 .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 实例...

如果您想调用 parent 上的方法,那么您有两种选择。第一个是将 parent 的引用传递给 child。没有办法解决这个问题,object 无法知道它是从哪个 object 引用的。事实上,它可以被多个 parent object 引用。

更好的解决方案是使用事件。这样 child 就永远不会知道 parent(s) 的任何信息,并且可以发出任何数量的组件都可以订阅的事件。有关事件的更多详细信息,请参阅 here。例如,您的组件可能如下所示:

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!");
    }
}