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
有没有人尝试过使用 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