[英]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有效。
所以我的問題是:
為什么我的單元測試通過? (我是單元測試的新手,所以也許我在這里做錯了什么?)
因為我的所有服務,存儲庫,IDbContext等都可以正常工作,我如何才能使Autofac也解析此接口?
我不確定asp.net mvc 6是否在模型綁定階段使用DI容器
這確實是問題所在。 Google還提供了更多功能,但沒有發現MVC 6在模型綁定階段使用了DI容器。
通過在方法中使用具體類來解決。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.