如果目标类型没有实现某些接口,则抛出Autofac

时间:2014-09-09 03:43:52

标签: c# autofac

使用Autofac,我注册了某种数据类型(IMapWorld的实施者)。我有一种特定的数据类型IMapComposition,从架构的角度来看,它允许获得IMapWorld的实例。如果其他人试图从Autofac容器中获取IMapWorld实例,我希望抛出异常。换句话说,我想要这样的东西:

builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>().ElseThrow();

这可以用Autofac完成吗?

2 个答案:

答案 0 :(得分:3)

这样做没有Autofac的一流功能,但您可以使用Keyed功能以某种方式完成...

builder.RegisterType<MapWorld>().Keyed<IMapWorld>(typeof(IMapComposition));

然后更改IMapComposition实现者​​的注册以使用

.ResolveKeyed<IMapWorld>(typeof(IMapComposition)) 

解决他们的依赖。

答案 1 :(得分:2)

我假设你试图在这里强制执行设计,以便当有人打破它时,他会得到例外。

        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时,如果没有指定任意参数,它就会抛出。

不是最干净的解决方案,但应该防止意外的设计违规。通过添加自定义注册扩展方法可以稍微改善这一点。