我在 DryIoC 容器周围创建了一个包装器,它只是一个将任务委托给 DryIoC 方法的类(例如,myContainer.Register<T>()
将调用dryIoC.Register<T>()
)。目标只是将真正的实现隐藏在我的界面后面,以便我可以根据需要切换到另一个 DI 容器。
一切正常,但是我今天在从此处获取的示例代码中尝试使用Scopes like 时遇到了问题
// example using DryIoC
var container = new Container();
container.Register<B>();
using (var scope = container.OpenScope())
{
var a = new A();
scope.UseInstance(a); // Scoped
scope.Resolve<B>(); // will inject `a`
}
var anotherA = new A();
container.UseInstance(anotherA); // Singleton
container.Resolve<B>(); // will inject `anotherA`
我天真的包装器实现是创建另一个接受 DryIoC 容器实例的构造函数,并这样做:
// My Wrapper class
public Infrastructure.IMyContainer OpenScope()
{
return new MyContainer(dryIoC.OpenScope());
}
我的理解是dryIoC.OpenScope()
返回容器的一个新实例,所以我所要做的就是在内部保存这个实例并用它来解析我的类。但是那个实现对我不起作用,这里是我的单元测试:
[Test]
public void OpenScope_Creates_A_Scoped_Container()
{
var _container = new MyContainer();
_container.Register<IMyInterface, MyImpl>();
_container.Register<MyDependingClass>();
MyDependingClass cls1 = null;
MyDependingClass cls2 = null;
var dep = new MyImpl();
using (var scope = _container.OpenScope())
{
scope.UseInstance(dep);
cls1 = scope.Resolve<MyDependingClass>(); // this should inject 'dep' instance created in the line before the creation of the scope
}
cls2 = _container.Resolve<MyDependingClass>(); // this should inject another instance.
cls1.Dep.ShouldBeSameAs(dep); // cls1 was resolved in the scope, so it should get 'dep' instance
cls1.Dep.ShouldNotBeSameAs(cls2.Dep); // cls2.Dep should be different
}
// stub classes/interfaces
class MyDependingClass
{
public MyDependingClass(IMyInterface dep)
{
Dep = dep;
}
public IMyInterface Dep { get; }
}
class MyImpl : IMyInterface { }
但是这个测试没有 cls1.Dep.ShouldBeSameAs(dep);
告诉我这两个实例IMyInterface
是不同的!!!我错过了什么吗?