【问题标题】:Singleton object with parameterized constructor [duplicate]具有参数化构造函数的单例对象[重复]
【发布时间】:2016-06-09 07:28:39
【问题描述】:

我正在开发一个使用 MS CRM 服务的 WCF 服务。我需要在多个地方初始化服务实例,这需要很长时间才能初始化。我通过如下实现单例模式解决了这个问题。

public sealed class MSCRM
{
   private static readonly MSCRM instance = new MSCRM();
   private static readonly IOrganizationService service =GetOrgService(true);
   static MSCRM() { }
   private MSCRM() { }

   private static MSCRM Instance { get { return instance; } }
   public static IOrganizationService Service { get { return service;} }

   private static readonly object LockThread = new object();

   private static IOrganizationService GetOrgService(bool admin = false, string callerId = null)
   {

   }
}

但我需要在我的 GetOrgService 方法中传递参数。我该怎么做?

编辑:我更改了代码并添加了公共 GetService 方法。但是这次当我同时从多个客户端调用我的服务时,服务会抛出“无法访问已处理的对象”异常。如何使我的 IOrganizationService 属性线程安全且单例。

public sealed class MSCRM
{
    private static readonly MSCRM instance = new MSCRM();
    private static IOrganizationService service;

    static MSCRM() { }

    private MSCRM() { }

    public static MSCRM Instance { get { return instance; } }

    public IOrganizationService GetOrgService(bool admin = false, string callerId = null)
    {
        return service ?? (service = GetService(admin, callerId));
    }

    private static IOrganizationService GetService(bool admin = false, string callerId = null)
    {

    }
}

【问题讨论】:

  • 你已经在传递一个参数true

标签: c# web-services wcf design-patterns singleton


【解决方案1】:

既然你的方法GetOrgService是私有的,你只在这里输入方法的参数吗? 如果是,“无事可做”

无论如何,不​​要调用您的属性public static IOrganizationService Service { get { return service;} },只需创建一个带有所需参数的方法GetService

【讨论】:

  • 您是否在使用后处理您的“IOrganizationService”对象?
  • 不,我没有处理服务对象。我只是得到服务,然后使用它的方法。
  • 这里的问题是并发问题。多个进程同时访问同一个静态方法。添加锁应该可以解决它。
  • 我添加了if (service != null) return service; lock (typeof(IOrganizationService)) { service = GetOrgService(admin, callerId); } return service;,但问题没有解决。
  • 在您的GetOrgService 中添加一个锁,就像这个示例一样:msdn.microsoft.com/en-us/library/c5kehkcz.aspx 只需将锁定变量设置为静态变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多