Catel.IoC.TypeNotRegisteredException:Catel 抛出异常,即使 CanResolve returns 为真
Catel.IoC.TypeNotRegisteredException: Catel throws exception even though CanResolve returns true
我有一个安装了 Catel.Core、Catel.MVVM、Catel.Analyzers 和 Catel.Fody 的 WPF 应用程序。
当我启动应用程序并尝试解析数据访问存储库 (ILigaMannschaftenZuordnungenRepository
) 时,抛出异常 Catel.IoC.TypeNotRegisteredException。当我调用 dependencyResolver.CanResolve<ILigaMannschaftenZuordnungenRepository>();
时,它 returns 为真。
我做了一个扩展方法来在一个地方注册每个服务和存储库。
public static IServiceLocator RegisterDataAccessRepositories(this IServiceLocator services, string dbCon)
{
services.RegisterInstance(new SpielbetriebDbContext(dbCon));
services.RegisterType<IDuelleRepository, DuelleRepository>();
services.RegisterType<IDuellErgebnisseRepository, DuellErgebnisseRepository>();
services.RegisterType<ILigaMannschaftenZuordnungenRepository, LigaMannschaftenZuordnungenRepository>(); // It is registered!
services.RegisterType<IMitgliederRepository, MitgliederRepository>();
services.RegisterType<IPartieDetailsRepository, PartieDetailsRepository>();
services.RegisterType<IPartienRepository, PartienRepository>();
services.RegisterType<IProtokollierungenRepository, ProtokollierungenRepository>();
services.RegisterType<ISaetzeRepository, SaetzeRepository>();
services
.RegisterType<ISpielerPartieErgebnisZuordnungenRepository,
SpielerPartieErgebnisZuordnungenRepository>();
services.RegisterType<ISpielerRepository, SpielerRepository>();
services.RegisterType<IVereineRepository, VereineRepository>();
return services;
}
当我调试应用程序并检查 ServiceLocator 的注册类型时,它甚至显示 ILigaMannschaftenZuordnungenRepository
已注册(字段 _registeredTypes
):
在 OnStartup 中调用扩展。我什至在 App class.
的构造函数中尝试过
var serviceLocator = this.GetServiceLocator();
serviceLocator.RegisterDataAccessRepositories(DataConfig.CurrentDbCon); // <--
serviceLocator.RegisterApplicationServices();
我试图用 Resolve 方法立即调用它
var dep = this.GetDependencyResolver();
dep.Resolve<ILigaMannschaftenZuordnungenRepository>();
dep.CanResolve<ILigaMannschaftenZuordnungenRepository>(); // returns true
我做错了什么?
异常消息
好的,在调试了一段时间并检查了多项内容之后,我再次查看了我的数据访问存储库。我意识到我的存储库的实现有一个 internal
构造函数而不是 public 构造函数。原因是基础存储库,它有一个内部构造函数。从 internal
更改为 public
后,DI 容器正确解析了类型。
如果您 运行 遇到这个问题,请检查您的类型是否有 public 构造函数。
差:
internal LigaMannschaftenZuordnungenRepository(SpielbetriebDbContext context) : base(context)
{
}
好:
public LigaMannschaftenZuordnungenRepository(SpielbetriebDbContext context) : base(context)
{
}
我有一个安装了 Catel.Core、Catel.MVVM、Catel.Analyzers 和 Catel.Fody 的 WPF 应用程序。
当我启动应用程序并尝试解析数据访问存储库 (ILigaMannschaftenZuordnungenRepository
) 时,抛出异常 Catel.IoC.TypeNotRegisteredException。当我调用 dependencyResolver.CanResolve<ILigaMannschaftenZuordnungenRepository>();
时,它 returns 为真。
我做了一个扩展方法来在一个地方注册每个服务和存储库。
public static IServiceLocator RegisterDataAccessRepositories(this IServiceLocator services, string dbCon)
{
services.RegisterInstance(new SpielbetriebDbContext(dbCon));
services.RegisterType<IDuelleRepository, DuelleRepository>();
services.RegisterType<IDuellErgebnisseRepository, DuellErgebnisseRepository>();
services.RegisterType<ILigaMannschaftenZuordnungenRepository, LigaMannschaftenZuordnungenRepository>(); // It is registered!
services.RegisterType<IMitgliederRepository, MitgliederRepository>();
services.RegisterType<IPartieDetailsRepository, PartieDetailsRepository>();
services.RegisterType<IPartienRepository, PartienRepository>();
services.RegisterType<IProtokollierungenRepository, ProtokollierungenRepository>();
services.RegisterType<ISaetzeRepository, SaetzeRepository>();
services
.RegisterType<ISpielerPartieErgebnisZuordnungenRepository,
SpielerPartieErgebnisZuordnungenRepository>();
services.RegisterType<ISpielerRepository, SpielerRepository>();
services.RegisterType<IVereineRepository, VereineRepository>();
return services;
}
当我调试应用程序并检查 ServiceLocator 的注册类型时,它甚至显示 ILigaMannschaftenZuordnungenRepository
已注册(字段 _registeredTypes
):
在 OnStartup 中调用扩展。我什至在 App class.
的构造函数中尝试过var serviceLocator = this.GetServiceLocator();
serviceLocator.RegisterDataAccessRepositories(DataConfig.CurrentDbCon); // <--
serviceLocator.RegisterApplicationServices();
我试图用 Resolve 方法立即调用它
var dep = this.GetDependencyResolver();
dep.Resolve<ILigaMannschaftenZuordnungenRepository>();
dep.CanResolve<ILigaMannschaftenZuordnungenRepository>(); // returns true
我做错了什么?
异常消息
好的,在调试了一段时间并检查了多项内容之后,我再次查看了我的数据访问存储库。我意识到我的存储库的实现有一个 internal
构造函数而不是 public 构造函数。原因是基础存储库,它有一个内部构造函数。从 internal
更改为 public
后,DI 容器正确解析了类型。
如果您 运行 遇到这个问题,请检查您的类型是否有 public 构造函数。
差:
internal LigaMannschaftenZuordnungenRepository(SpielbetriebDbContext context) : base(context)
{
}
好:
public LigaMannschaftenZuordnungenRepository(SpielbetriebDbContext context) : base(context)
{
}