从调用者类调用方法,避免循环依赖

本文关键字:循环 依赖 方法 调用者 调用 | 更新日期: 2023-09-27 17:52:46

我有一个windows窗体应用程序包含3个项目在一个解决方案。

Hall.Client <—Winforms

Hall.Admin <—Winforms

Hall.Processor <——类库

Hall.ClientHall.Admin需要参考Hall.Processor。由于循环依赖,Hall.Processor不能同时添加对Hall.ClientHall.Admin的引用。我所需要的就是在Hall.Processor

中获得每个调用者类的实例

Hall.Client中我有一个名为Canopy的类

public class Canopy : System.Windows.Form
{
    public void SetProcessName(string name)
    {
        this.txtProcessName.Text = name;
    }
}

Hall.Admin中,我有一个名为Roof的类

public class Roof : System.Windows.Form
{
    public void SetProcessName(string name)
    {
        this.txtProcessName.Text = name;
    }
}

我有一个方法在Hall.Processor内的Builder类

public class Builder
{
    Form form;
    public Builder(Form form)
    {
        //Here the main problem.
        //if the caller class is Hall.Admin.Roof then this.form should be Hall.Admin.Roof
        //if the caller class is Hall.Client.Canopy then this.form should be Hall.Client.Canopy
    }
    public void SetProcessName()
    {
        //How to call method in caller class directly from this class
        //if(Admin.Roof) then form.SetProcessName("something about admin");
        //if(Client.Canopy) then form.SetProcessName("something about client");
    }
}
我需要一些建议来解决我的问题。是否有与我的问题相关的设计模式?

从调用者类调用方法,避免循环依赖

通过使用接口来解耦类。您可以在Processor库中声明所有接口,或者更好的是在单独的库中声明,在Client, AdminProcessor项目之间共享。然后你可以检查form is IRoofform is ICanopy

注意,在这种情况下,没有什么可以阻止Admin实现ICanopyClient执行IRoof。如果这确实是一个问题,将接口设置为internal,并通过[assembly: InternalsVisibleTo("Assembly")]控制它们对其他程序集的可见性(参见"友元程序集")。

进一步,在网上搜索"Dependency Injection"