如果目标类型未实现特定接口,则具有Autofac抛出
本文关键字:抛出 Autofac 接口 类型 目标 实现 如果 | 更新日期: 2023-09-27 18:21:19
使用Autofac,我注册了某个数据类型(IMapWorld
的实现者)。我有一个特定的数据类型IMapComposition
,从体系结构的角度来看,它可以获得IMapWorld
的实例。如果其他人试图从Autofac容器中获取一个实例If IMapWorld
,我希望抛出一个异常。换句话说,我想要这样的东西:
builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>().ElseThrow();
这可以用Autofac完成吗?
Autofac没有一流的功能可以做到这一点,但您可以使用Keyed功能以某种方式。。。
builder.RegisterType<MapWorld>().Keyed<IMapWorld>(typeof(IMapComposition));
然后更改IMapComposition
实现者的注册以使用
.ResolveKeyed<IMapWorld>(typeof(IMapComposition))
以解决它们的依赖性。
我假设你试图在这里强制执行设计,这样当有人破坏它时,他就会得到一个异常。
containerBuilder.Register((c, p) =>
{
if (!p.Named<bool>("CanResolveIMapWorld")) throw new Exception();
return new MapWorld();
});
containerBuilder.Register( c =>
new MapComposition
{
MapWorld = c.Resolve<IMapWorld>(new NamedParameter("CanResolveIMapWorld", true))
});
每当有人试图在不指定任意参数的情况下正常解析IMapWorld时,它就会抛出。
不是最干净的解决方案,但应该防止意外的设计漏洞。这可以通过添加自定义注册扩展方法来进行一点预定义。