首页 文章

注册无法解决

提问于
浏览
1

自动解析.Net Core框架并没有在DryIoC中找到我的注册 .

这使用了新的.Net Core 2框架,DryIoC 2.10.7和DryIoc.Microsoft.DependencyInjection 1.2.2 . 我无法更新到DryIoC 2.11.7,因为DryIoc.Microsoft.DependencyInjection没有获取最新版本 . 我确实尝试在2.11.7安装后重新安装后者,但这不起作用(模糊引用) .

这是我的启动代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .AddControllersAsServices();

    var container = new Container(rules => rules.With(propertiesAndFields: PropertiesAndFields.Auto))
                   .WithDependencyInjectionAdapter(services);
    container.ConfigureServiceProvider<CompositionRoot>();
}

这是我的注册码:

public CompositionRoot(IRegistrator registrator, IContainer container)
{
        //System Clock
        registrator.Register<IClock, ConcreteClock>(Reuse.Singleton, null, null, IfAlreadyRegistered.Keep);
        container.RegisterInstance<ISystemConfiguration>(new Configuration(container.Resolve<IClock>()), Reuse.Singleton, IfAlreadyRegistered.Keep);

        //Logging
        container.RegisterInstance<ILogging>(CreateLogger(container.Resolve<ISystemConfiguration>()), Reuse.Singleton, IfAlreadyRegistered.Keep);
}

最后控制器:

public class AdminController : Controller
{
    private readonly ILogging _log;
    private readonly IClock _clock;
    public AdminController(ILogging log,
                           IClock clock)
    {
        _log = log;
        _clock = clock;
    }
}

这是一个例外:

System.InvalidOperationException:尝试激活“DataDictionaryService.Controllers.AdminController”时,无法解析类型“SharedAssets.Interfaces.ILogging”的服务 . at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType,Type implementationType,ISet1 callSiteChain,ParameterInfo [] parameters,Boolean throwIfCallSiteNotFound)at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType,Type implementationType,ISet1) callSiteChain)在Microsoft.Extensions.DependencyInjection上的Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType,ISet1 callSiteChain)中的Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor描述符,类型serviceType,ISet1 callSiteChain) . System.Collections.Concurrent.ConcurrentDictionaryExtensions.Ge上的Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(类型serviceType,ServiceProvider serviceProvider)中的ServiceLookup.CallSiteFactory.CreateCallSite(类型serviceType,ISet1 callSiteChain)在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider)的Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)上添加[TKey,TValue,TArg](ConcurrentDictionary2字典,TKey键,Func`3 valueFactory,TArg arg) . ,在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker的Microsoft.AspNetCore.Mvc.Controllers.ServiceBasedControllerActivator.Create(ControllerContext actionContext)中输入Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider . <> c__DisplayClass5_0.g__CreateController0(ControllerContext controllerContext) . .Next(State&next,Scope&scope,Object&state,Boolean&isCompleted)at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext()---从抛出异常的上一个位置开始的堆栈跟踪---在系统中System.Runtime.CompilerServices.TaskAwaiter.HandleNonSucces中的.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__22.MoveNext()中的sAndDebuggerNotification(任务任务)---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在Microsoft.AspNetCore.Mvc.Internal的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)中的Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State&next,Scope&scope,Object&state,Boolean&isCompleted) . ResourceInvoker.d__17.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System.R的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()中的untime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.ExceptionServices.ExceptionDispatchInfo .Throw()在Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中 - 从抛出异常的上一个位置开始的堆栈跟踪结束 - - 在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()atMicrosoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

谢谢!

1 回答

  • 1

    使用自定义DI框架时,您需要更新 ConfigureServices 以返回自定义 IServiceProvider .

    public IServiceProvider ConfigureServices(IServiceCollection services) {
        services.AddMvc()
                .AddControllersAsServices();
    
        var container = new Container(rules => rules.With(propertiesAndFields: PropertiesAndFields.Auto))
                       .WithDependencyInjectionAdapter(services);
        var provider = container.ConfigureServiceProvider<CompositionRoot>();
        return provider
    }
    

    在运行时,您的提供程序将用于解析类型和注入依赖项 .

    参考:Introduction to Dependency Injection in ASP.NET Core: Replacing the default services container

相关问题