C# Autofac RegisterGeneric在单元测试中工作,但不在应用中
我有一个ASP.NET MVC 6(Framework 4.6.1)应用程序,Autofac版本为4.0.0-rc1-177 在我的Startup.cs中,我调用我制作的AutofacLoader: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
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可以正常工作
所以我的问题是:
通过在方法中使用混凝土类解决。1。因为您直接调用
Resolve
,它返回一个实例2。你确定它会起作用吗?我不确定asp.NETMVC6是否在模型绑定阶段使用DI容器(如果确定-共享链接-我从未听说过)。我所知道的是,您需要编写自定义模型绑定器,它将知道如何实例化接口。这个定制的活页夹可以被其他一些类注入。你可能想重新标记你的问题以获得更多的关注。ASP.NET Core拥有DI现在运行的钩子,而不是Autofac。Autofac只是ASP.NET核心使用的容器。