从调用者类调用方法,避免循环依赖
本文关键字:循环 依赖 方法 调用者 调用 | 更新日期: 2023-09-27 17:52:46
我有一个windows窗体应用程序包含3个项目在一个解决方案。
Hall.Client
<—Winforms
Hall.Admin
<—Winforms
Hall.Processor
<——类库
Hall.Client
和Hall.Admin
需要参考Hall.Processor
。由于循环依赖,Hall.Processor
不能同时添加对Hall.Client
和Hall.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
, Admin
和Processor
项目之间共享。然后你可以检查form is IRoof
或form is ICanopy
。
注意,在这种情况下,没有什么可以阻止Admin
实现ICanopy
或Client
执行IRoof
。如果这确实是一个问题,将接口设置为internal
,并通过[assembly: InternalsVisibleTo("Assembly")]
控制它们对其他程序集的可见性(参见"友元程序集")。
进一步,在网上搜索"Dependency Injection"。