【问题标题】:Call method from caller class and avoid circular dependency从调用者类调用方法,避免循环依赖
【发布时间】:2016-03-16 19:44:53
【问题描述】:

我有一个 Windows 窗体应用程序,其中包含 1 个解决方案中的 3 个项目。

Hall.Client

Hall.Admin

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;
    }
}

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

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

我需要建议如何解决我的问题。有没有与我的问题相关的设计模式?

【问题讨论】:

    标签: c# class design-patterns .net-assembly circular-dependency


    【解决方案1】:

    通过使用接口将类彼此分离。您可以在Processor 库中声明所有接口,或者更好的是在单独的库中声明,在ClientAdminProcessor 项目之间共享。然后您可以进行form is IRoofform is ICanopy 之类的检查。

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

    进一步,在网上搜索“依赖注入”

    【讨论】:

    • 我仍然对你的解释感到困惑。网上有很多例子,但没有一个符合我的需要。
    • @derodevil,到底有什么令人困惑的地方?你熟悉interfaces in C#吗?
    • 是的,我是。我在想的是工厂模式而不是 DI。这就是我的困惑。
    • 你的工厂可以像Type.GetType/Activator.CreateInstance一样简单。这不是“工厂或 DI”:msdn.microsoft.com/en-us/magazine/cc163739.aspx
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多