1

.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, ISet1 callSiteChain) で Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (ServiceDescriptor 記述子、タイプ serviceType、ISet 1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, ISet1 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](ConcurrentDictionary2 ディクショナリ、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)

ありがとう!

4

1 に答える 1

1

ConfigureServicesカスタム DI フレームワークを使用する場合は、カスタム を返すように を更新する必要があります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
}

実行時に、プロバイダーを使用して型を解決し、依存関係を挿入します。

参照: ASP.NET Core での依存関係の挿入の概要: 既定のサービス コンテナーの置き換え

于 2017-08-17T16:39:39.643 に答える