从Autofac迁移DryIoC:无法使用ResolveParameter进行解析

时间:2019-04-29 12:39:24

标签: c# dryioc

我正在尝试使用指定的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好。

0 个答案:

没有答案