ASP.NET核心视图注入问题
本文关键字:注入 问题 视图 核心 NET ASP | 更新日期: 2023-09-27 18:00:09
是否有人尝试使用ASP.NET Core中的新视图注入?我正在尝试使用文档中描述的直接方法(https://docs.asp.net/en/latest/mvc/views/dependency-injection.html)但根本没有成功。
与我的实现和文档的独特区别在于,我使用AutoFac进行DI。当我尝试在视图中使用注入时,我会得到一个异常,即我的服务尚未注册。
@inject Domain.Service.LevelService LevelService
错误消息:
ComponentNotRegisteredException:请求的服务"Domain.service.LevelService"尚未注册。若要避免此异常,请注册一个组件以提供服务,使用IsRegistered()检查服务注册,或者使用ResolveOption()方法解析可选依赖项。
顺便说一句,服务是正确注册的,例如可以从控制器访问。
编辑以包括启动:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddMemoryCache();
services.AddSession();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
return new AutofacServiceProvider(DependencyInjection.RegisterServices(services));
}
方法RegisterServices:的代码
public static IContainer RegisterServices(IServiceCollection services)
{
// Create the container builder.
var builder = new ContainerBuilder();
var assembly = Assembly.GetExecutingAssembly();
assembly.GetTypes()
.Where(x => x.IsSubclassOf(typeof(ServiceInjectionModule)))
.ToList()
.ForEach(x =>
{
var t = (ServiceInjectionModule)Activator.CreateInstance(x, new object[] { true });
t.AddtoContainer(builder);
});
// Add automapper configurations
var mapperConfiguration = AutoMapperConfig.Configure();
var mapper = mapperConfiguration.CreateMapper();
builder.RegisterInstance(mapper).As<IMapper>();
// Populate default services
builder.Populate(services);
return builder.Build();
}
问题出在您编写的程序集扫描部分。使用AutoFac的内置功能要容易得多。基于您没有使用GetTypeInfo
这一事实,不能确定您的代码是.Net Core。GetTypeInfo向后兼容,因此可以与.Net 4.x 一起使用
public static IContainer RegisterServices(IServiceCollection services)
{
// Create the container builder.
var builder = new ContainerBuilder();
var assembly = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assembly)
.Where(t => t.GetTypeInfo().IsSubclassOf(typeof(ServiceInjectionModule)))
.AsSelf();
// Add automapper configurations
var mapperConfiguration = AutoMapperConfig.Configure();
var mapper = mapperConfiguration.CreateMapper();
builder.RegisterInstance(mapper).As<IMapper>();
// Populate default services
builder.Populate(services);
return builder.Build();
}
好的,我解决了这个问题。嗯,我没有注意到,似乎也没有人注意到:p。
问题是,我试图注入一个实例,而不是一个接口。只是更改了实现,一切都开始工作。
最终代码:
@inject Domain.Service.Interfaces.ILevelService LevelService