簡體   English   中英

ASP.NET Core視圖注入問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM