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

ASP.NET核心视图注入问题

问题出在您编写的程序集扫描部分。使用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