DryIoC мигрирует из Autofac: разрешить с помощью ResolveParameter невозможно - PullRequest
1 голос
/ 29 апреля 2019

Я пытаюсь разрешить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...