.Net Core フレームワークの自動解決で、DryIoC 内の登録が見つかりません。
これは、新しい .Net Core 2 フレームワーク、DryIoC 2.10.7 および DryIoc.Microsoft.DependencyInjection 1.2.2 を使用します。DryIoc.Microsoft.DependencyInjection が最新バージョンを取得しないため、DryIoC 2.11.7 に更新できません。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.CreateArgumentCallSites (タイプ serviceType、タイプ implementationType、ISet
1 callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType, Type implementationType, ISet
1 callSiteChain) で Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (ServiceDescriptor 記述子、タイプ serviceType、ISet1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, ISet
1 callSiteChain) で Microsoft.Extensions .DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(Type serviceType, ISet1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceProvider.CreateServiceAccessor(Type serviceType, ServiceProvider serviceProvider) at System.Collections.Concurrent.ConcurrentDictionaryExtensions.GetOrAdd[TKey,TValue,TArg](ConcurrentDictionary
2 ディクショナリ、TKey キー、Func`3 valueFactory、TArg arg) を Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) で、Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider プロバイダー、Type 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.ControllerActionInvoker.Next(State& next, Scope& scope, Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14 のオブジェクトと状態、ブール値と isCompleted)。MoveNext() --- 例外がスローされた前の場所からのスタック トレースの終わり --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) で Microsoft.AspNetCore .Mvc.Internal.ResourceInvoker.d__22.MoveNext() --- 例外がスローされた前の場所からのスタック トレースの終わり --- Microsoft.AspNetCore.Mvc.Internal の System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() で。 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State& next、Scope& scope、Object& state、Boolean& isCompleted) の ResourceInvoker.Rethrow (ResourceExecutedContext context) (Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17)。MoveNext() --- 例外がスローされた前の場所からのスタック トレースの終わり --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) で Microsoft.AspNetCore .Mvc.Internal.ResourceInvoker.d__15.MoveNext() --- 例外がスローされた前の場所からのスタック トレースの終わり --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() で System.Runtime.CompilerServices.TaskAwaiter で。 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() での HandleNonSuccessAndDebuggerNotification(Task task) --- 例外がスローされた前の場所からのスタック トレースの終わり --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() で System .Runtime.CompilerServices.Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext() での TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) --- 例外がスローされた前の場所からのスタック トレースの終了 --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw で() Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (タスク タスク) でMicrosoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() での HandleNonSuccessAndDebuggerNotification (Task task)Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext() での HandleNonSuccessAndDebuggerNotification (Task task)
ありがとう!