引用窗体表单应用程序和类库时的循环依赖性问题

时间:2013-11-08 10:29:22

标签: c#

我有一个'窗体表单应用程序'项目,它有一个类库的引用,比如说LibA。现在LibA想要访问这个“窗体表单应用程序”项目的一些数据,现在该怎么做?由于循环依赖性,我无法在LibA中添加这个“窗体应用程序”项目的引用。

3 个答案:

答案 0 :(得分:2)

你不能在'窗体申请表'中引用 LibA 并在 LibA中引用'窗体申请表' 即可。您只能以一种方式添加引用。

如果您处于这种情况,那意味着您的项目架构设计不合理。因此,为了克服这种情况,你应该以这样的方式设计它,这样你就不会遇到这种情况。

您可以参考以下链接,其中循环依赖关系以及如何过来已经得到了很好的解释

What is Circular dependency and how do we resolve it

答案 1 :(得分:0)

类库永远不应引用Windows窗体(应用程序级别的项目)

您面临的问题与软件设计(或软件架构)有关

如果类库需要来自Windows窗体的东西,则意味着窗体窗体项目正在做一些它不负责的事情。

你有两个解决方案,都意味着重新设计

  • 将代码从Windows窗体传递到类库
  • 创建一个新的类库项目,将“常用”代码放在那里并在两个项目中引用它

我强烈建议您阅读有关系统架构的信息

SOLID Design

多层应用程序。一个example与asp.net

修改

尽管如此,如果你知道它的危险,你可以从输出bin目录而不是Project中引用windows窗体dll本身。注意这是非常糟糕的代码,只在非常罕见的情况下才能完成。

第二种选择,也不推荐,是使用反射来访问windows窗体dll。您可以使用Assembly.Load(),然后在运行时调用或获取属性值。

鉴于您(可能)的专业水平,我强烈建议您更多地了解系统架构。

答案 2 :(得分:0)

这是一个快速而又肮脏的技巧,可以绕过循环依赖问题(尽管如此,我同意SpiderCode的观点,认为这不应该在一个好的架构中发生)。

  • 在程序集LibA中,定义:

    public interface IMyUi
    {
        // put whatever functions you need to access from LibA
        string GetData();
    }
    
    public static class MyUiProvider
    {
        public static IMyUi MyUi;
    }
    
  • 在程序集LibB中,只需使您想要的类实现IMyUi,并在程序加载时分配MyUiProvider.MyUi

完成此操作后,您可以通过MyUiProvider.MyUi.GetData()使用您的用户界面。

NB:我把它作为静态来获得模式的快速示例。这可能不是一个好习惯:静态将您的UI保存在gc根目录中,并禁止您拥有多个实例......但您可以将该想法转换为实例注入接口。

NB 2:这种模式被称为“控制反转”