2017-08-17 126 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