[英]ASP.NET Core View Injection problems
有沒有人試圖使用ASP.NET Core中的新View Injection? 我試圖按照文檔( https://docs.asp.net/en/latest/mvc/views/dependency-injection.html )中所述直接使用,但沒有成功。
我的實現和文檔的獨特之處在於我使用的是AutoFac for 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的內置功能要容易得多。 不確定基於您未使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.