我正在尝试使用指定的ITestInterface虚假实例解析TestClassC。通过指定ResolveParameter,可以使用Autofac进行此操作。这完全有可能与DryIoC合作吗?我已经通读了文档和其他类似问题的文章,但没有找到在Resolve中指定内容的方法。我的要求是通过此测试。
private class TestClassB : ITestInterface { }
private class TestClassC
{
public TestClassC(ITestInterface instance)
{
Instance = instance;
}
public ITestInterface Instance { get; }
}
[TestCase("key")]
public void RegisterKeyedDependency_WhenCalled_EqualsExpected(string key)
{
var Container = new Container();
var fake = A.Fake<ITestInterface>();
Container.Register<TestClassC>();
Container.UseInstance(fake, serviceKey: key);
Container.Register<ITestInterface, TestClassB>(Reuse.Singleton);
var result1 = Container.Resolve<TestClassC>();
var result2 = Container.Resolve<TestClassC>(/* How to specify that I want to use the fake here */);
Assert.That(result1.Instance, Is.Not.EqualTo(fake));
Assert.That(result2.Instance, Is.EqualTo(fake));
}
编辑:我找到了一个可能的解决方案,该解决方案虽然不令人满意,但现在可以解决。
[Pure]
public static T ResolveWithDependency<T, TDependency>(this Container container, string key)
{
return container.Resolve<Func<TDependency, T>>().Invoke(container.Resolve<TDependency>(key));
}
基本上,如果您使用Func解决依赖关系,DryIoC将保持依赖关系打开。但是,如果您有多个要在“解决”时选择的依赖项,这将变得非常乏味。如果想要5种依赖关系,则必须选择具有5个参数的Func,它不如Autofac ResoleParameter API好。