使用Autofac,我注册了某种数据类型(IMapWorld
的实施者)。我有一种特定的数据类型IMapComposition
,从架构的角度来看,它允许获得IMapWorld
的实例。如果其他人试图从Autofac容器中获取IMapWorld
实例,我希望抛出异常。换句话说,我想要这样的东西:
builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>().ElseThrow();
这可以用Autofac完成吗?
答案 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时,如果没有指定任意参数,它就会抛出。
不是最干净的解决方案,但应该防止意外的设计违规。通过添加自定义注册扩展方法可以稍微改善这一点。