如果目标类型未实现特定接口,则具有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抛出

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时,它就会抛出。

不是最干净的解决方案,但应该防止意外的设计漏洞。这可以通过添加自定义注册扩展方法来进行一点预定义。