Шаблон создания / дизайна для IDisposable классов - PullRequest
0 голосов
/ 19 сентября 2018

Это больше вопрос общего шаблона проектирования.У меня есть класс IDisposable, который принимает один компонент в своем конструкторе и работает с ним в конструкторе.Я хотел бы провести рефакторинг этого класса, чтобы иметь возможность иметь дело с IEnumerable.Упрощенный код ниже.

public class ResourceManager: IDisposable {
    //Component is disposable object 
    private IEnumerable<Component> m_components;
    private bool disposed = false;

    ResourceManager(Component component): this(new []{component}) 
    {
    }

    ResourceManager(IEnumerable<Component> components) 
    {
        m_components = components;

        //do some other work

        foreach(component in m_components) {
            component.Foo();
        }
    }

    public void Dispose() 
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual Dispose(bool disposing) 
    {
        if (diposed) 
            return;
        if (!disposing)
            return;

        //do some work

        foreach(component in m_components) 
            component.Dispose();

        disposed = true;
    }   
}

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что большую часть времени ResourceManager будет создаваться с одним компонентом, поэтому преобразование в IEnumerable добавляет накладные расходы.ResourceManager активно используется при ведении журналов, поэтому я бы хотел этого избежать.

Я хотел бы реорганизовать ResourceManager в AbstractResourceManager и иметь две конкретные реализации, одну для одного компонента и одну для нескольких, которые будутсозданный через ResourceManagerFactory.За исключением того, что между двумя классами будет много повторяющегося кода, поскольку единственное различие между этими двумя классами заключается в наличии циклов foreach для вызова component.Dipose ().Есть ли лучший способ приблизиться к этому?

...