C# Autofac RegisterGeneric在单元测试中工作,但不在应用中

C# Autofac RegisterGeneric在单元测试中工作,但不在应用中,c#,unit-testing,dependency-injection,asp.net-core-mvc,autofac,C#,Unit Testing,Dependency Injection,Asp.net Core Mvc,Autofac,我有一个ASP.NET MVC 6(Framework 4.6.1)应用程序,Autofac版本为4.0.0-rc1-177 在我的Startup.cs中,我调用我制作的AutofacLoader: var container = Core.DI.AutofacLoader.Configure(services).Build(); AutofacLoader类: public class AutofacLoader { public static IContainer Containe

我有一个ASP.NET MVC 6(Framework 4.6.1)应用程序,Autofac版本为4.0.0-rc1-177

在我的Startup.cs中,我调用我制作的AutofacLoader:

var container = Core.DI.AutofacLoader.Configure(services).Build();
AutofacLoader类:

public class AutofacLoader
{
    public static IContainer Container { get; set; }

    /// <summary>
    /// Register the DI modules through AutoFac
    /// </summary>
    /// <param name="services">IServiceCollection to register the modules on</param>
    /// <returns></returns>
    public static ContainerBuilder Configure(IServiceCollection services)
    {
        var builder = new ContainerBuilder();

        builder.RegisterModule<LogRequestsModule>();
        //Core
        builder.RegisterModule(new Core.ServiceModules.AutoMapperModule());
        builder.RegisterModule(new Core.ServiceModules.ServicesModule());
        builder.RegisterModule(new DAL.ServicesModules.IBSRepositoriesModule());

        //Dieet
        builder.RegisterModule(new Dieet.Core.ServiceModules.AutoMapperModule());
        builder.RegisterModule(new Dieet.Core.ServiceModules.ServicesModule());
        builder.RegisterModule(new Dieet.DAL.ServicesModules.DieetRepositoriesModule());

        //builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
        if (services == null)
        {
            Container = builder.Build();
        }
        else
        {
            builder.Populate(services);

        }
        return builder;
    }
}
namespace IBS.Core.ServiceModules
{
    public class ServicesModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            var assembly = System.Reflection.Assembly.GetExecutingAssembly();
            builder.RegisterAssemblyTypes(assembly)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();
            builder.RegisterGeneric(typeof(PaginatedSearchViewModel<>)).As(typeof(IPaginatedSearchViewModel<>)).InstancePerLifetimeScope();
        }
    }
}
公共类自动加载程序
{
公共静态IContainer容器{get;set;}
/// 
///通过AutoFac注册DI模块
/// 
///IServiceCollection在上注册模块
/// 
公共静态容器生成器配置(IServiceCollection服务)
{
var builder=new ContainerBuilder();
builder.RegisterModule();
//核心
RegisterModule(新的Core.ServiceModules.AutoMapperModule());
RegisterModule(新的Core.ServiceModules.ServicesModule());
RegisterModule(新的DAL.ServicesModules.ibsrepositionismodule());
//迪埃
RegisterModule(新的diet.Core.ServiceModules.AutoMapperModule());
RegisterModule(新的diet.Core.ServiceModules.ServicesModule());
RegisterModule(新的diet.DAL.ServicesModules.dieetrepositionesmodule());
//RegisterAssemblyModule(Assembly.getExecutionGassembly());
if(服务==null)
{
Container=builder.Build();
}
其他的
{
建造商。填充(服务);
}
返回生成器;
}
}
我的IBS.Core.ServicesModules.ServiceModule类(当我在此类中放置断点时,会在启动我的应用程序时调用该类,因此由AutofacLoader类调用):

名称空间IBS.Core.ServiceModules
{
公共类服务模块:模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
var assembly=System.Reflection.assembly.getExecutionGassembly();
builder.RegisterAssemblyTypes(程序集)
.Where(t=>t.Name.EndsWith(“服务”))
.a实现接口();
builder.RegisterGeneric(typeof(PaginatedSearchViewModel)).As(typeof(IPaginatedSearchViewModel)).InstancePerLifetimeScope();
}
}
}
我的xunit测试(使用FluentAssertions)通过:

public class ServiceModulesTest
{
    [Fact]
    public void ShouldBeInstantiatable()
    {
        AutofacLoader.Configure(null);
        var container = AutofacLoader.Container;
        var instance = container.Resolve<IPaginatedSearchViewModel<PatientViewModel>>();

        instance.Should().BeOfType<PaginatedSearchViewModel<PatientViewModel>>();
    }
}
公共类服务模块测试
{
[事实]
public void应该是可安装的()
{
AutofacLoader.Configure(空);
var container=AutofacLoader.container;
var instance=container.Resolve();
instance.Should().BeOfType();
}
}
但当我运行应用程序时,在我的一个API控制器中,我得到了例如以下方法:

    [HttpGet("patienten")]
    public async Task<PagedResult<PatientViewModel>> GetPatientsAsync(IPaginatedSearchViewModel<PatientFilters> vm)
    {
        return await _infohosService.GetAllPatientsWithDossiersAndVerpleegperiodesAsync(vm);
    }
[HttpGet(“patienten”)]
公共异步任务GetPatientsAsync(IPaginatedSearchViewModel vm)
{
return wait(返回等待信息服务),获取所有患者的档案,并定期同步(vm);;
}
此操作在浏览器中失败,响应为:无法解析接口

当我将IPaginatedSearchViewModel更改为参数中的具体类时:

    [HttpGet("patienten")]
    public async Task<PagedResult<PatientViewModel>> GetPatientsAsync(PaginatedSearchViewModel<PatientFilters> vm)
    {
        return await _infohosService.GetAllPatientsWithDossiersAndVerpleegperiodesAsync(vm);
    }
[HttpGet(“patienten”)]
公共异步任务GetPatientsAsync(分页搜索视图模型vm)
{
return wait(返回等待信息服务),获取所有患者的档案,并定期同步(vm);;
}
API可以正常工作

所以我的问题是:

  • 为什么我的单元测试通过了?(我是单元测试新手,所以可能我在这里做错了什么?)

  • 我怎样才能让Autofac也解析这个接口,因为它对我的所有服务、存储库、IDbContext……都可以正常工作

  • 我不确定asp.NETMVC6是否在模型绑定阶段使用DI容器

    这确实是问题所在。我在Google上搜索了更多,没有发现MVC6在模型绑定阶段使用DI容器


    通过在方法中使用混凝土类解决。

    1。因为您直接调用
    Resolve
    ,它返回一个实例2。你确定它会起作用吗?我不确定asp.NETMVC6是否在模型绑定阶段使用DI容器(如果确定-共享链接-我从未听说过)。我所知道的是,您需要编写自定义模型绑定器,它将知道如何实例化接口。这个定制的活页夹可以被其他一些类注入。你可能想重新标记你的问题以获得更多的关注。ASP.NET Core拥有DI现在运行的钩子,而不是Autofac。Autofac只是ASP.NET核心使用的容器。