封闭的通用类型注册-Autofac –无法解析构造函数的参数x

时间:2018-09-18 16:30:04

标签: asp.net-core autofac

我遇到以下异常:

  

“使用类型为'NetCore.DAL.EF.Repositories.Core.Common.SystemSettingRepository'的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的任何构造函数都不能使用可用的服务和参数来调用:\ r \ n无法解析参数'NetCore.DAL.EF.DatabaseFactory np.argmax(result) # 5 np.argmax(trainY[100]) # true label # 5 1 [NetCore.DAL.EF.AppDbContext])'。”

这是SystemSettingRepository的Autofac注册信息:

  

autofacServiceProvider.Non-Public成员。_lifetimeScope.ComponentRegistry.Registrations[28] = {Activator = SystemSettingRepository(ReflectionActivator),服务= [Dcs.NetCore.ApplicationCore.BLL.Domain.Features.Common.SystemSettings.ISystemSettingRepository,Dcs。 NetCore.Infrastructure.Common.IRepository`1 [[Dcs.NetCore.ApplicationCore.BLL.Domain.Entities.Common.SystemSetting,Dcs.NetCore.ApplicationCore.BLL,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]] ,NetCore.DAL.EF.Repositories.Core.Common.SystemSettingRepository],生命周期= Autofac.Core.Lifetime.CurrentScopeLifetime,共享=无,所有权= OwnedByLifetimeScope}

     

autofacServiceProvider.Non-Public成员。_lifetimeScope.ComponentRegistry.Registrations[28]。 Target.Services [0] .ServiceType = {Dcs.NetCore.ApplicationCore.BLL.Domain.Features.Common。 SystemSettings.ISystemSettingRepository}

     

autofacServiceProvider.Non-Public成员。_lifetimeScope.ComponentRegistry.Registrations[28]。 Target.Services [1] .ServiceType = {Dcs.NetCore.Infrastructure.Common.IRepository`1 [Dcs。 NetCore.ApplicationCore.BLL.Domain.Entities.Common.SystemSetting]}

     

autofacServiceProvider.Non-Public成员。_lifetimeScope.ComponentRegistry.Registrations[28]。 Target.Services [2] .ServiceType = {NetCore.DAL.EF.Repositories.Core.Common.SystemSettingRepository}

如您所见,服务已注册。但是,databaseFactory参数不是。这是我的代码:

book = Book.new
book.title = 'Legends'
book.content  = 'Once upon a time, in a far away galaxy'
book.serializable_hash # => {"title"=>"Legends", "content"=>"Once upon a time, in a far away galaxy"}

1 个答案:

答案 0 :(得分:1)

该问题是由 bottomnavigation.setOnNavigationItemSelectedListener { item -> when(item.itemId){ R.id.first_fragment_item -> { var fragment:Fragment = FirstFragment.newInstance() replaceFragment(fragment) return@setOnNavigationItemSelectedListener true } R.id.second_fragment_item -> { var fragment:Fragment = SecondFragment.newInstance() replaceFragment(fragment) return@setOnNavigationItemSelectedListener true } } return@setOnNavigationItemSelectedListener false } } fun replaceFragment(fragment:Fragment) { var fragmentName:String = fragment::class.simpleName!! if(supportFragmentManager.findFragmentByTag(fragmentName)==null) { val fragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, fragment, fragmentName) fragmentTransaction.addToBackStack(fragmentName) fragmentTransaction.commit() } else{ if(fragmentName == "FirstFragment") { supportFragmentManager.beginTransaction(). hide(supportFragmentManager.findFragmentByTag("SecondFragment")) .show(supportFragmentManager.findFragmentByTag("FirstFragment")) .commit() } else{ supportFragmentManager.beginTransaction() .hide(supportFragmentManager.findFragmentByTag("FirstFragment")) .show(supportFragmentManager.findFragmentByTag("SecondFragment")) .commit() } } } 的注册方式引起的。此类型注册为接口<?php $list = " 1 2 3 6 7 8 11 12 14 15 16 17 18 19 "; //make an array from a string list $templates = array_values(array_filter(array_map('trim', explode("\n", $list)))); $temp = null; foreach (range(0, 364) as $number) { $temp[] = $templates[$number%14]; } print_r($temp); 。但是在存储库注册时,方法DatabaseFactory<>的lambda参数本身可以解决此问题:

IDatabaseFactory<>

Autofac不知道如何解决它,因为它没有相应的注册。为了使您的代码正常工作,您可以将DatabaseFactory解析为如下接口:

WithParameter()

或将 _builder.RegisterAssemblyTypes(_assembly) .AsClosedTypesOf(typeof(IRepository<>)) .WithParameter(new ResolvedParameter((p, i) => p.Name == "databaseFactory", // resolving type it self // while it was registered as interface (p, i) => i.Resolve<DatabaseFactory<AppDbContext>>())) 呼叫添加到注册:

.WithParameter(new ResolvedParameter((p, i) => p.Name == "databaseFactory",
                                     (p, i) => i.Resolve<IDatabaseFactory<AppDbContext>>()))
相关问题