Я работаю с сторонним объектом, который реализует IDisposable. Для того, чтобы сделать модульный тест «способным», я создаю обертку. Я понимаю, что объект реализует IDisposable, которому моя оболочка также нуждается в реализации IDisposable.Реализация и использование IDisposable
public interface IWrapper : IDisposable
{
void Complete();
}
public class Wrapper : IWrapper
{
private readonly ThirdPartyLib lib;
public Wrapper()
{
lib = new ThirdPartyLib();
}
public void Complete()
{
lib.Comlete();
}
public void Dispose()
{
lib.Dispose();
}
}
public class Processor : IProcessor
{
private readonly IWrapper wrapper;
public Processor(IWrapper wrapper)
{
this.wrapper = wrapper;
}
public void Process()
{
// do some work
using (wrapper) {
// do more work
}
}
}
Пусть процессор впрыскивается в некотором классе, который использует его и процесс() выполняется
- Что happends в обертку, если мы называем процесс() еще раз? - не будет ли ThirdPartyLib() выдавать исключение, поскольку он был создан только один раз (в конструкторе оберток), и теперь он был удален
- Не может ли он быть удален до тех пор, пока есть ссылка на него?
- Если обертка возможно будет построить таким образом, чтобы новый() «ИНГ» из ThirdPartyLib быть выполнена не в конструкторе, но в отдельном методе, скажем, Begin() - например, так:
public class Wrapper : IWrapper { private ThirdPartyLib lib; public void Begin() { lib = new ThirdPartyLib(); } public void Complete() { lib.Comlete(); } public void Dispose() { lib.Dispose(); } }
Затем, используя его:
using (wrapper.Begin()) {
Я чувствую, что у нас нет большой картины для этого.Почему «Процессор» обрабатывает только один «Wrapper», который был введен в конструктор? Обычно я ожидаю, что вы «Процессор» будет иметь вызов метода, такой как «Process (обертка IWrapper)», позволяющий обрабатывать эту оболочку, но опять же я был бы в лагере, чтобы вызывающие вызывали вызов «Dispose» на «IWrapper», так как он действительно владеет им. Если это не так, я, скорее всего, реализую 'IDisposable' на' IProcessor' и только распоряжаюсь 'IWrapper', когда это удастся. –
Будет ли реализация IDisposable на IProcessor удалять только Wrapper при размещении IProcessor (в текущем проекте), а не при ударе "}" использования инструкции? Является ли это потому, что (родительский) IProcessor содержит ссылку на IWrapper - даже если мы сказали, что он расположен на "}" – BobSwanson
Вот почему объекты, инициализированные с DI, должны предполагать, что у них есть введенный объект_. Большую часть времени они являются одиночными играми, используемыми другими объектами или, по крайней мере, чем-то другим, управляют временем жизни. Объекты, зависящие от DI, должны просто _use_ объекта и предполагать, что. Независимо от того, что создал входящий объект, он также несет ответственность за его последующее использование. DI похож на «эй, я просто хочу объект, кто-то другой может его создать и удалить» _ – MickyD