Я пытаюсь разрешить TestClassC с указанным поддельным экземпляром ITestInterface. Это можно сделать с помощью Autofac, указав ResolveParameter. Это возможно с 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));
}
В основном DryIoC будет сохранять зависимость открытой, если вы разрешите ее с помощью функции. Однако это становится очень утомительным, если у вас есть несколько зависимостей, которые вы хотите выбрать во время разрешения. Если вы хотите использовать его для примерно 5 зависимостей, вам нужно выбрать Func с 5 параметрами, это не так хорошо, как API Autofac ResoleParameter.