AutoFixture可以通过约定注册接口吗?

时间:2015-09-07 10:26:33

标签: c# autofixture

我的应用程序使用简单的注射器来处理我的ioc。 我有一些像下面的代码可以自动注册。

RegisterForAssembly(container, webApiLifestyle, typeof(IAddEntityCommand).Assembly, "MyProj.CommandQuery.Commands");
RegisterForAssembly(container, webApiLifestyle, typeof(IGetAllEntityQuery).Assembly, "MyProj.CommandQuery.Queries");

private static void RegisterForAssembly(Container container, WebApiRequestLifestyle webApiLifestyle, Assembly assembly, string nameSpace)
{
    var registrations =
       from type in assembly.GetExportedTypes()
       where type.Namespace == nameSpace
       where type.GetInterfaces().Any()
       select new { InterfaceType = type.GetInterfaces().Single(), ConcreteType = type };

     foreach (var reg in registrations)
     {
        container.Register(reg.InterfaceType, reg.ConcreteType, webApiLifestyle);
     }
}

它基本上是在一个程序集中查找并将任何接口与它的具体命名空间配对。

我希望使用AutoFixture实现类似的功能

    private static void RegisterForAssembly(Fixture fixture, Assembly assembly, string nameSpace)
    {
        var registrations =
            from type in assembly.GetExportedTypes()
            where type.Namespace == nameSpace
            where type.GetInterfaces().Any()
            select new { InterfaceType = type.GetInterfaces().Single(), ConcreteType = type };

        foreach (var reg in registrations)
        {
            //fixture.Register... ???
            //fixture.Register<reg.InterfaceType>(() => fixture.Create<reg.ConcreteType>();
        }
    }

然后我想知道我是否重新发明轮子,它可能是内置的东西,但我在文档中找不到任何东西。

== 简短版本==

我想配置自动夹具,为给定接口提供正确的具体内容,而无需单独注册它们。

1 个答案:

答案 0 :(得分:6)

您可以使用TypeRelay个实例。对于每一对,您可以执行以下操作:

fixture.Customizations.Add(new TypeRelay(anInterfaceType, aConcreteType));