Windows 窗体引用和具有冲突导入类型的单例

Posted

技术标签:

【中文标题】Windows 窗体引用和具有冲突导入类型的单例【英文标题】:Windows forms references and singleton with conflicted imported type 【发布时间】:2020-01-30 23:02:55 【问题描述】:

我有以下项目的解决方案:

模型:与模型共享的项目 App1:Windows 窗体应用程序 App2:另一个 Windows 窗体应用程序

我正在尝试将当前在两个项目中重复的一些 UserControl 移动到一个名为 CommonUI 的通用项目中。所以:

型号 CommonUI:参考模型 App1:引用模型和 CommonUI App2:引用模型和 CommonUI

但这给了我很多警告,例如:

'[..]Model\AppState.cs' 中的类型 'AppState' 与 '[..]CommonUI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 中的导入类型 'AppState' 冲突.使用 '[..]Model\AppState.cs' 中定义的类型

问题是 AppState 是一个单例,但它被重复了,App1 看到一个实例,CommonUI 看到另一个实例我现在有 2 个名为“AppState”的类,一个来自参考 App1->Model,另一个来自 App1 ->CommonUI->模型。

我做错了什么?谢谢

【问题讨论】:

你有没有把同一个文件复制到多个项目中? 有些用户控件重复但命名空间不同。该应用程序以这种方式工作了很多年,但现在我需要将这些用户控件合并到某种“用户控件库”中 问题似乎出在项目之间的引用中,我必须发布一些代码的唯一方法是压缩整个解决方案并上传... 【参考方案1】:

AppStateModel 中声明,这是一个共享项目。共享项目是not a class library。 共享项目中的源代码被编译到每个引用它的项目中。换句话说,如果您有 - 比如说 - 3 个引用 Model 项目的项目,那么您将声明 AppState 类 3 次。

解决方案是将Model 转换为类库,或将AppState 移至其他位置。

根据我的经验,最好仅将共享项目用于要构建到可执行文件中的相对无关紧要的小段实用程序代码。从库中引用它们,或者将它们用作库,都是自找麻烦。

【讨论】:

【参考方案2】:

供将来参考,以防有人遇到同样的问题。

“问题”是共享项目。共享项目直接注入到引用项目中,所以我的代码被注入到 CommonUI 项目和 App1 项目中。 CommonUI 项目编译成一个 DLL(包含模型),供 App1 exe 使用,因此 exe 和 DLL 都包含模型代码。

从共享项目切换到类库解决了这个问题。

【讨论】:

以上是关于Windows 窗体引用和具有冲突导入类型的单例的主要内容,如果未能解决你的问题,请参考以下文章

如何写一个简单的单例模式?

Xamarin MVVMCross:注册具有多个接口的类的单例

设计模式——JS中的单例模式应用

Python中的单例模式

Spring 单例 多例 线程安全等问题,想请教大家

Android之线程安全的单例模式,Adapter注意事项之引用传值