C# 自动夹具和动态夹具类型注射

C# 自动夹具和动态夹具类型注射,c#,autofixture,C#,Autofixture,我是AutoFixture的新手,在尝试动态冻结和注入类型时遇到了一些问题。下面是一个我一直在重复的代码示例,以便将假存储库注入到我的设备中: FakeRepository<Application> applicationRepository = fixture.Freeze<FakeRepository<Application>>(); fixture.Inject<IReadRepository<Application>>(appl

我是AutoFixture的新手,在尝试动态冻结和注入类型时遇到了一些问题。下面是一个我一直在重复的代码示例,以便将假存储库注入到我的设备中:

FakeRepository<Application> applicationRepository = fixture.Freeze<FakeRepository<Application>>();
fixture.Inject<IReadRepository<Application>>(applicationRepository);
fixture.Inject<IWriteRepository<Application>>(applicationRepository);
使用SpecimenBuilderNodeFactory尝试2:

var repositoryObject = fixture.Freeze(repositoryType);

fixture.Customizations.Add(new TypeRelay(repositoryReadInterfaceType, repositoryType));
fixture.Customizations.Add(new TypeRelay(repositoryWriteInterfaceType, repositoryType));
var repositoryObject = fixture.Freeze(repositoryType);

fixture.Customizations.Insert(
    0,
    SpecimenBuilderNodeFactory.CreateTypedNode(
        repositoryReadInterfaceType,
        new FixedBuilder(repositoryObject)
    )
);
fixture.Customizations.Insert(
    0,
    SpecimenBuilderNodeFactory.CreateTypedNode(
        repositoryWriteInterfaceType,
        new FixedBuilder(repositoryObject)
    )
);
尝试3次仅使用动态冻结:

var repositoryObject = fixture.Freeze(repositoryType);

fixture.Customizations.Add(new TypeRelay(repositoryReadInterfaceType, repositoryType));
fixture.Customizations.Add(new TypeRelay(repositoryWriteInterfaceType, repositoryType));
var repositoryObject = fixture.Freeze(repositoryType);

fixture.Customizations.Insert(
    0,
    SpecimenBuilderNodeFactory.CreateTypedNode(
        repositoryReadInterfaceType,
        new FixedBuilder(repositoryObject)
    )
);
fixture.Customizations.Insert(
    0,
    SpecimenBuilderNodeFactory.CreateTypedNode(
        repositoryWriteInterfaceType,
        new FixedBuilder(repositoryObject)
    )
);
在使用反射的另一种方法中,我冻结了所有假存储库,如下所示:

var repositoryObject = fixture.Freeze(repositoryType);
然后,在我的主要方法中,我手动注入读和写存储库类型:

fixture.Inject<IReadRepository<Application>>(fixture.Create<FakeRepository<Application>>());
fixture.Inject<IWriteRepository<Application>>(fixture.Create<FakeRepository<Application>>());
fixture.Inject(fixture.Create());
fixture.Inject(fixture.Create());

上述所有尝试都会导致读写类型似乎不指向同一个伪造位置。更新的答案,原始的进一步向下

此复制工作正常(测试通过):


您也可以使用
自定义。添加
,但请注意,该集合中的顺序很重要(第一场比赛获胜)。

感谢您的回复!我给它打了一针,它似乎不起作用。出于某种原因,写入和读取存储库似乎并不指向同一个伪造存储库。我也给了TypeRelay一次机会,但那给了我同样的结果。@哦,是的,我忘记了
TypeRelay
s。这些应该有用。你能分享一下你试过的吗?我用我试过的两段代码更新了我的原始帖子。我感觉这可能与冻结有关。从我重复执行注入的第一个示例中,我尝试只使用反射动态地执行冻结,然后让fixture创建FakeRepository对象以手动注入IReadRepository和IWriteRepository,结果相同。我将创建一个尝试3来展示这个场景。我完全尝试了你所拥有的,我发现了我的问题所在。您有:fixture.Freeze();而我有:fixture.Freeze(typeof(FooBar));。有没有一种方法可以让冻结的行为与您的示例相同,而不显式定义类型?
fixture.Customizations.Insert(
    0,
    SpecimenBuilderNodeFactory.CreateTypedNode(
        myType,
        new FixedBuilder(myObject)));