2017-08-17 128 views
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'类型的服务。在在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor 描述符,类型的serviceType,ISet的 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(类型 的serviceType,类型implementationType,ISet的1 callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType, Type implementationType, ISet 1 callSiteChain) callSiteChain)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(类型 的serviceType,ISet的字典,TKEY的键,Func`3 valueFactory,TARG ARG)在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 serviceType)at Microsoft.Extensio ns.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(的IServiceProvider 提供商类型的serviceType)在 Microsoft.AspNetCore.Mvc.Controllers.ServiceBasedControllerActivator.Create(ControllerContext ActionContext中)在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider。 <> c__DisplayClass5_0.g__CreateController0(ControllerContext controllerContext)处 Microsoft.AspNetCore.Mvc.Internal Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态& 下,适用范围&范围,对象&状态,布尔& isCompleted) .ControllerActionInvoker.d__14.MoveNext() ---从先前的位置,其中引发异常堆栈跟踪的末尾在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (任务 任务)在 Microsoft.AspNetCore.Mvc.Int ernal.ResourceInvoker.d__22.MoveNext() ---以前位置抛出异常的堆栈跟踪结束--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() Microsoft.AspNetCore.Mvc.Internal。 ResourceInvoker.Rethrow(ResourceExecutedContext 上下文)在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker。接下来在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext() ---从以前的位置,其中的例外是堆栈跟踪的结尾(州&接下来, 范围&范围,对象&状态,布尔& isCompleted)抛出---在在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)() ---抛出异常的先前位置的堆栈跟踪结束---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo .Throw()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() ---从先前的位置堆栈跟踪,其中抛出异常结束---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext() ---从以前的位置抛出异常的堆栈跟踪结束---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()

谢谢!

+0

以看一个[例如用于DryIoC](https://bitbucket.org/dadhi/dryioc/src/8e609b011beafd71236f9cfe3bb2d3e0589e76ae/NetCore/src/DryIoc.AspNetCore.Sample/Startup。 cs?at = default&fileviewer = file-view-default)你需要返回容器。 – DavidG

+0

谢谢DavidG,我不知道我是如何错过这个的,因为我看过同样的例子。我想这12个小时的日子已经开始接近我了...... – ChrisB

回答

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

+0

谢谢,恩科西。然而,在改变我的代码以遵循你的例子之后,我现在得到了一个非常钝的StackOverflowException(讽刺/巧合,它是真实的......)。 System.Private.CoreLib.dll中发生未处理的System.StackOverflowException类型异常 从VS2017中的内存图形看来,DryIoC看起来像是溢出。 – ChrisB

+0

@ChrisB。这看起来像循环依赖的迹象。尝试创建单元测试。设置容器并尝试解决您的其中一项服务。看看你是否得到同样的问题。如果是,那么你需要检查你的类,看看你有循环依赖的地方。 – Nkosi

+0

得到它的工作。添加到容器的规则会以某种方式导致错误。更奇怪的是,在完成所有注册后,我有容器自我验证,并且在验证时不抛出StackOverflowException:“container.VerifyResolutions();” – ChrisB