自动解析.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 回答
使用自定义DI框架时,您需要更新
ConfigureServices
以返回自定义IServiceProvider
.在运行时,您的提供程序将用于解析类型和注入依赖项 .
参考:Introduction to Dependency Injection in ASP.NET Core: Replacing the default services container