簡體   English   中英

Autofac RegisterGeneric可在單元測試中使用,但不能在應用程序中使用

[英]Autofac RegisterGeneric works in unit test but not in application

我有一個帶有Autofac版本4.0.0-rc1-177的ASP.NET MVC 6(框架4.6.1)應用程序。

在我的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;
    }
}

我的IBS.Core.ServicesModules.ServiceModule類(當我在此類中添加斷點時,在啟動應用程序時會調用它,因此由AutofacLoader類調用):

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();
        }
    }
}

我的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>>();
    }
}

但是,當我運行應用程序時,在我的一個API控制器中,我得到了例如以下方法:

    [HttpGet("patienten")]
    public async Task<PagedResult<PatientViewModel>> GetPatientsAsync(IPaginatedSearchViewModel<PatientFilters> vm)
    {
        return await _infohosService.GetAllPatientsWithDossiersAndVerpleegperiodesAsync(vm);
    }

這在瀏覽器中失敗,並顯示以下響應:無法解析接口。

當我自己將IPaginatedSearchViewModel更改為參數中的具體類時:

    [HttpGet("patienten")]
    public async Task<PagedResult<PatientViewModel>> GetPatientsAsync(PaginatedSearchViewModel<PatientFilters> vm)
    {
        return await _infohosService.GetAllPatientsWithDossiersAndVerpleegperiodesAsync(vm);
    }

該API有效。

所以我的問題是:

  1. 為什么我的單元測試通過? (我是單元測試的新手,所以也許我在這里做錯了什么?)

  2. 因為我的所有服務,存儲庫,IDbContext等都可以正常工作,我如何才能使Autofac也解析此接口?

我不確定asp.net mvc 6是否在模型綁定階段使用DI容器

這確實是問題所在。 Google還提供了更多功能,但沒有發現MVC 6在模型綁定階段使用了DI容器。

通過在方法中使用具體類來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM