2016-01-07 6 views
0

У меня есть обертка API, которая имеет ряд свойств, которые инициализируются при их первом использовании. Когда вызывается метод класса Disposed, он располагает всеми остальными классами, которые он хранит. Однако есть хорошая вероятность, что только один или два из этих других классов были инициализированы в любом случае. Если эти классы еще не инициализированы, метод Dispose фактически завершает их инициализацию и их удаление. Это массовое ресурсоемкое и продолжительное время, но я не могу придумать способ его устранения.Только утилизировать инициализированные объекты?

Это класс.

public class SalesForceApi : ISalesForce, IDisposable 
{ 
    public Logger Logger = LogManager.GetCurrentClassLogger(); 

    private IAccounts _accounts; 
    private IAttachments _attachments; 
    private ICases _cases; 
    private IContacts _contacts; 
    private IGroups _groups; 
    private IRecordTypes _recordTypes; 
    private IUsers _users; 

    public IAccounts Accounts => _accounts ?? (_accounts = new Accounts()); 

    public IAttachments Attachments => _attachments ?? (_attachments = new Attachments()); 
    public ICases Cases => _cases ?? (_cases = new Cases()); 
    public IContacts Contacts => _contacts ?? (_contacts = new Contacts()); 
    public IGroups Groups => _groups ?? (_groups = new Groups()); 
    public IRecordTypes RecordTypes => _recordTypes ?? (_recordTypes = new RecordTypes()); 
    public IUsers Users => _users ?? (_users = new Users()); 

    public SalesForceApi() 
    { 

    } 

    public void Dispose() 
    { 
     Logger.Trace("Disposing of Acccounts..."); 
     Accounts.Dispose(); 
     Logger.Trace("Disposing of Attachments..."); 
     Attachments.Dispose(); 
     Logger.Trace("Disposing of Cases..."); 
     Cases.Dispose(); 
     Logger.Trace("Disposing of Contacts..."); 
     Contacts.Dispose(); 
     Logger.Trace("Disposing of Groups..."); 
     Groups.Dispose(); 
     Logger.Trace("Disposing of RecordTypes..."); 
     RecordTypes.Dispose(); 
     Logger.Trace("Disposing of Users..."); 
     Users.Dispose(); 
    } 
} 

И вот что в результате выглядит журнал:

SalesForceApi_v1.SalesForceApi::Disposing of Acccounts... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of Attachments... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of Cases... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of Contacts... 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of Groups... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of RecordTypes... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 
SalesForceApi_v1.SalesForceApi::Disposing of Users... 
SalesForceApi_v1.Requests.RequestBase::Logging into SalesForce... 
SalesForceApi_v1.Requests.RequestBase::SalesForce login successful! 
SalesForceApi_v1.Requests.RequestBase::Logging out of SalesForce. 

ответ

5

При утилизации, не называют методы, отложенной инициализации; тестировать и размещать переменные частного члена (_accounts и т. д.).

+0

Ой, я рефакторинг и только что заметил, что я не распоряжаюсь частными членами. –

3

Не используйте свойства в методе Dispose, используйте частные поля.

public void Dispose() 
{ 
    Logger.Trace("Disposing of Acccounts..."); 
    if(_accounts != null) _accounts.Dispose(); 
    Logger.Trace("Disposing of Attachments..."); 
    if(_attachments != null) _attachments.Dispose(); 
    // ... 
} 
0

Вы можете обернуть свое распоряжение частной проверкой нулевого элемента. Поскольку вы ленивая загрузка, вызов Property.Dispose() фактически создает экземпляр класса, просто чтобы избавиться от него. Я также хотел, чтобы мои члены были обнулены после удаления, так что он бросает исключение NullReferenceException, если я попытаюсь получить к нему доступ снова.

public void Dispose() 
{ 
    if (_accounts != null) 
    { 
     Logger.Trace("Disposing of Acccounts..."); 
     Accounts.Dispose(); 
     // or 
     // _accounts.Dispose(); 
     // _accounts = null; 
    } 
    if (_attachments != null) 
    { 
     Logger.Trace("Disposing of Attachments..."); 
     Attachments.Dispose(); 
     // or 
     // _attachments.Dispose(); 
     // _attachments = null; 
    } 
    if (_cases != null) 
    { 
     Logger.Trace("Disposing of Cases..."); 
     Cases.Dispose(); 
     // or 
     // _cases.Dispose(); 
     // _cases= null; 
    } 
    if (_contacts != null) 
    { 
     Logger.Trace("Disposing of Contacts..."); 
     Contacts.Dispose(); 
     // or 
     // _contacts.Dispose(); 
     // _contacts = null; 
    } 
    if (_groups != null) 
    { 
     Logger.Trace("Disposing of Groups..."); 
     Groups.Dispose(); 
     // or 
     // _groups.Dispose(); 
     // _groups = null; 
    } 
    if (_recordTypes != null) 
    { 
     Logger.Trace("Disposing of RecordTypes..."); 
     RecordTypes.Dispose(); 
     // or 
     // _recordTypes.Dispose(); 
     // _recordTypes = null; 
    } 
    if (_users!= null) 
    { 
     Logger.Trace("Disposing of Users..."); 
     Users.Dispose(); 
     // or 
     // _users.Dispose(); 
     // _users= null; 
    } 
} 
Смежные вопросы