我有一个'窗体表单应用程序'项目,它有一个类库的引用,比如说LibA。现在LibA想要访问这个“窗体表单应用程序”项目的一些数据,现在该怎么做?由于循环依赖性,我无法在LibA中添加这个“窗体应用程序”项目的引用。
答案 0 :(得分:2)
你不能在'窗体申请表'中引用 LibA 并在 LibA中引用'窗体申请表' 即可。您只能以一种方式添加引用。
如果您处于这种情况,那意味着您的项目架构设计不合理。因此,为了克服这种情况,你应该以这样的方式设计它,这样你就不会遇到这种情况。
您可以参考以下链接,其中循环依赖关系以及如何过来已经得到了很好的解释
答案 1 :(得分:0)
类库永远不应引用Windows窗体(应用程序级别的项目)
您面临的问题与软件设计(或软件架构)有关
如果类库需要来自Windows窗体的东西,则意味着窗体窗体项目正在做一些它不负责的事情。
你有两个解决方案,都意味着重新设计
我强烈建议您阅读有关系统架构的信息
多层应用程序。一个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:这种模式被称为“控制反转”