2016-06-09 4 views
0

Я разрабатываю службу WCF, использующую службы MS CRM. Мне нужно инициализировать экземпляр службы в нескольких местах, и это займет много времени для init. Я решил эту проблему с реализацией singleton-шаблона, как показано ниже.Объект Singleton с параметризованным конструктором

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. Как я могу это сделать ?

EDIT: Я изменил свой код и добавил общедоступный метод GetService. Но на этот раз, когда я вызываю свое обслуживание у нескольких клиентов одновременно, служба бросает исключение «не может получить доступ к удаленному объекту». Как я могу сделать свой ресурс IOrganizationService потокобезопасным и singleton.

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) 
    { 

    } 
} 
+0

Вы уже передали параметр 'true' –

ответ

0

Поскольку ваш метод GetOrgService является частным, сделать вам параметры метод ввода только здесь? Если да, «ничего не делать»

В любом случае, вместо того, чтобы называть вашу собственность public static IOrganizationService Service { get { return service;} }, просто создайте метод GetService с необходимыми параметрами.

+0

Вы используете объект'IrganizationService 'после использования? – Panda

+0

Нет. Я не располагаю объектом обслуживания. Я только получаю обслуживание, а затем использую его методы. –

+0

Проблема здесь в параллелизме. Несколько процессов одновременно обращаются к одному и тому же статическому методу. Добавление блокировки должно исправить это. – Panda