ASP.NET 核心视图注入问题

ASP.NET Core View Injection problems

有没有人尝试过使用 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() 检查服务注册,或使用 ResolveOptional() 方法解析可选依赖项。

顺便说一句,该服务已正确注册,例如可以从控制器访问。

编辑以包括启动:

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 的内置功能要容易得多。不确定您的代码是 .Net Core 只是因为您没有使用 GetTypeInfo。 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