Хорошо, позвольте мне обратиться к этому по порядку:
Обычный пользователь .NET вызвал бы file.Dispose ().
Вызов file.Dispose()
неверен,независимо от того, используете ли вы контейнер или нет.В .NET действует правило, согласно которому вы не должны уничтожать то, что не создали.
Это относится как к .Dispose()
, так и к ctor(Action<IFile> destroyCallback)
То есть, кому принадлежит файл ?что касается вашего кода, то фабрика это делает.Поэтому ответственность за очистку после файла лежит на фабрике.
Если вы сохраняете фабрику в качестве подробности реализации Disk
(как вам, скорее всего, следует), то Disk
является вашим API области поверхностидля открытия и закрытия файла , следовательно, необходим метод Close(IFile file)
, который в качестве детали реализации передает его на фабрику.
Поэтому использованиефайл будет выглядеть следующим образом:
var myfile = disk.OpenFile(@"c:\myfile.txt);
try
{
DoSomethingWithTheFile(myFile);
}
finally
{
disk.Close(myFile);
}
[РЕДАКТИРОВАТЬ: на основе комментария]
Хорошо, если вы ожидаете и хотите, чтобы у ваших пользователей был какой-то объект IDisposable
, тогда дайте имодин (я бы скорее посоветовал против этого, но это не мой вызов)
Затем метод OpenFile
вернет объект, который выглядит следующим образом:
public class FileScope:IDisposable
{
private Action<IFile> close;
public FileScope(IFile file, Action<IFile> close)
{
File = file;
this.close = close;
}
public IFile File {get; private set;}
public void Dispose()
{
close(file);
}
}
Закрытый делегат будет обратным вызовом дляdisk.Close
, как в
public FileScope OpenFile(string path)
{
return new FileScope(fileFactory.Create(path),Close);
}