我有一个“窗体应用程序”项目,它引用了类库,比如说 LibA。现在 LibA 想要访问这个“窗体应用程序”项目的一些数据,现在该怎么做?由于 cylic 依赖关系,我无法将此“窗体应用程序”项目的引用添加到 LibA。
3 回答
您不能同时在“窗体应用程序”中引用LibA和在LibA中引用“窗体应用程序”。您只能以一种方式添加参考。
如果您处于这种情况,则意味着您的项目架构设计得不好。所以要克服这种情况,你应该以这样的方式设计它,这样你就不会面对这种情况。
更多你可以参考下面的链接,其中已经很好地解释了循环依赖以及如何克服它
类库不应引用 Windows 窗体(应用程序级项目)
您面临的问题与软件设计(或软件架构)有关
如果类库需要 Windows 窗体中的某些内容,则意味着 Windows 窗体项目正在做一些它不负责的事情。
你有两个解决方案,都意味着重新设计
- 将代码从 windows 窗体传递到您的类库 或
- 创建一个新的类库项目,将“通用”代码放在那里并在两个项目中引用它
我强烈建议您阅读有关系统架构的信息
多层应用程序。asp.net的一个例子
编辑
不过,如果您意识到它的危险,您可以从输出 bin 目录而不是项目中引用 windows 窗体 dll 本身。注意这是非常糟糕的代码,仅在极少数情况下才会这样做。
第二个选择,同样不推荐,是使用反射来访问 windows 窗体 dll。您可以使用 Assembly.Load() 然后在运行时调用或获取属性值。
鉴于您(也许)的专业知识水平,我强烈建议您更多地了解系统架构。
这是绕过循环依赖问题的快速而肮脏的技巧(尽管如此,我同意 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:这种模式被称为“控制反转”