【问题标题】:C# singleton between projects didn't work项目之间的 C# 单例不起作用
【发布时间】:2013-05-11 16:19:37
【问题描述】:

我在这样的解决方案中有 3 个项目:

  1. Xna 游戏项目 (GAME) 参考图书馆
  2. 图书馆项目(图书馆)
  3. 参考库的 Windows 窗体项目 (WIN)

此项目有多个项目启动(WIN 和 GAME)。

因此,在我的库中,我有一个外观,可以使用单例注入它们之间的依赖关系,以提供一种统一的方式来使用插入串行连接器的设备。

这就是我使用单例的原因...因为我不能有 2 个连接到同一个端口。

在我的其他 2 个库(WIN 和 GAME)中,我通过这个外观使用导航器。但是结果总是两次尝试实例化串口,所以第二次总是失败!..

调试它,在该行添加断点:

private static readonly LogicalFaccade _instance = new LogicalFaccade();

我请求了 2 个不同的调用...我从每个项目(获胜和游戏)中获取一个。

如何在项目之间共享唯一实例?

我的代码有问题吗?...

public class LogicalFaccade
{
    private static readonly object thredLock = new Object();

    private static readonly LogicalFaccade _instance = new LogicalFaccade();
    public static LogicalFaccade Instance
    {
        get
        {
            return _instance;
        }
    }

    private INavigator _navigator;
    public INavigator Navigator
    {
        get
        {
            lock (thredLock)
            {
                if (_navigator == null)
                {
                    _navigator = new SerialNavigator("COM4", 19200, 8);
                }
                return _navigator;
            }
        }
    }
}

【问题讨论】:

  • 这就像跨多个应用程序管理状态对象。所以这可以使用状态服务器来实现。这意味着你需要管理一个服务来获取这个单例对象的状态。
  • 如果win和game两个不同的程序你应该使用一些IPC技术。例如管道、插座。

标签: c# singleton multiple-projects


【解决方案1】:

通过您的实现,您将有一个单例对象抛出 单个进程(或 EXE)的许多线程。
当有 3 个启动项目时,您将有 3 个不同的流程,因此使用单例模式(以您实施的方式)对您没有帮助。

如果您的 3 个项目(进程)将在 single workstation (PC) 上运行,您可以使用 Semaphore锁定机制 共享资源,可以在 here 找到有用的示例。
如果它们将在multiple PCs 上分发,您需要使用inter process communications

.Net 中的一些主要选项是:
WCF
Remoting
ASP.Net WebSevices
WM_COPYDATA
Socket programing

【讨论】:

    【解决方案2】:

    您可以使用 IPC 来实现它。这是命名管道示例的链接 http://www.codeproject.com/Articles/7176/Inter-Process-Communication-in-NET-Using-Named-Pip 。希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多