我与实现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的“ing”的,说开始() - 像这样:
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()) {
我觉得我们没有这个大图。为什么'Processor'只处理一个被注入到构造函数中的'Wrapper'?通常我会希望你'Processor'有一个方法调用,比如'Process(IWrapper wrapper)',允许你处理这个包装器,但是我会再次进入阵营,这将是调用者必须致电'处置'在'IWrapper'上,因为它实际上拥有它。如果情况并非如此,那么我可能会在'IProcessor'上实现'IDisposable',并且在处理时只处理'IWrapper'。 –
仅在IP处理器上实现IDisposable时,处理IP处理器时(在当前设计中),而不是在使用语句的“}”命中时处理包装器?这是因为(父)IP处理器持有对IWrapper的引用 - 即使我们告诉它将被放置在“}” – BobSwanson
这就是为什么用DI初始化的对象应该假设它们拥有注入的object_。大多数时候,他们是由其他对象使用的单身人士,或者至少是别的东西正在控制生命。依赖于DI的对象只应该使用该对象,并假定该对象创建的任何内容都将负责在稍后对其进行核对。 DI就像_“嘿,我只想要一个对象,别人可以为我创建和删除它”_ – MickyD