Это больше вопрос общего шаблона проектирования.У меня есть класс 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 ().Есть ли лучший способ приблизиться к этому?