1

我有一个“窗体应用程序”项目,它引用了类库,比如说 LibA。现在 LibA 想要访问这个“窗体应用程序”项目的一些数据,现在该怎么做?由于 cylic 依赖关系,我无法将此“窗体应用程序”项目的引用添加到 LibA。

4

3 回答 3

2

您不能同时在“窗体应用程序”中引用LibA和在LibA中引用“窗体应用程序”。您只能以一种方式添加参考。

如果您处于这种情况,则意味着您的项目架构设计得不好。所以要克服这种情况,你应该以这样的方式设计它,这样你就不会面对这种情况。

更多你可以参考下面的链接,其中已经很好地解释了循环依赖以及如何克服它

什么是循环依赖以及我们如何解决它

于 2013-11-08T10:35:08.467 回答
0

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

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

如果类库需要 Windows 窗体中的某些内容,则意味着 Windows 窗体项目正在做一些它不负责的事情。

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

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

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

固体设计

多层应用程序。asp.net的一个例子

编辑

不过,如果您意识到它的危险,您可以从输出 bin 目录而不是项目中引用 windows 窗体 dll 本身。注意这是非常糟糕的代码,仅在极少数情况下才会这样做。

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

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

于 2013-11-08T10:49:05.847 回答
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().

注意:我把它作为静态的,以便快速了解该模式。这可能不是一个好的做法:静态将您的 UI 保留在 gc 根中,并且它禁止您拥有多个实例……但您可以将这个想法转换为接口的实例注入。

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

于 2013-11-08T10:52:40.733 回答