具有参数化构造函数的Singleton对象

时间:2016-06-09 07:28:39

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

我正在开发使用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方法。但是这次当我同时从多个客户端调用我的服务时,服务抛出了#34;无法访问已处置的对象"例外。如何使我的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)
    {

    }
}

1 个答案:

答案 0 :(得分:0)

由于您的方法$data = array( 'post_params'=>[ 'Name1'=>'Foo', 'LastName1'=>'Bar', 'Name2'=>'Foo', 'LastName2'=>'Bar' ] );是私有的,您是否只在这里输入方法的参数? 如果是这样,“无事可做”

无论如何,只需创建一个包含所需参数的方法GetOrgService,而不是调用您的属性public static IOrganizationService Service { get { return service;} }