C# 如果目标类型未实现特定接口,则使用Autofac throw
使用Autofac,我注册了某个数据类型(IMapWorld的实现者)。我有一个特定的数据类型C# 如果目标类型未实现特定接口,则使用Autofac throw,c#,autofac,C#,Autofac,使用Autofac,我注册了某个数据类型(IMapWorld的实现者)。我有一个特定的数据类型IMapComposition,从架构的角度来看,它允许获取IMapWorld的实例。如果其他任何人试图从Autofac容器中获取实例IfIMapWorld,我希望引发异常。换句话说,我想要这样的东西: builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>()
IMapComposition
,从架构的角度来看,它允许获取IMapWorld
的实例。如果其他任何人试图从Autofac容器中获取实例IfIMapWorld
,我希望引发异常。换句话说,我想要这样的东西:
builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>().ElseThrow();
builder.RegisterType();
这可以通过Autofac实现吗?我假设您试图在这里强制设计,这样当有人破坏它时,他会得到一个例外
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))
});
containerBuilder.Register((c,p)=>
{
如果(!p.Named(“CanResolveIMapWorld”))抛出新异常();
返回新的MapWorld();
});
containerBuilder.Register(c=>
新地图合成
{
MapWorld=c.Resolve(新名称参数(“CanResolveIMapWorld”,true))
});
每当有人试图正常解析IMapWorld,而不指定任意参数时,它都会抛出
不是最干净的解决方案,但应防止意外的设计破坏。可以通过添加自定义注册扩展方法对其进行一些修饰。我假设您正在尝试在这里强制设计,这样当有人破坏它时,他将得到一个异常
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))
});
containerBuilder.Register((c,p)=>
{
如果(!p.Named(“CanResolveIMapWorld”))抛出新异常();
返回新的MapWorld();
});
containerBuilder.Register(c=>
新地图合成
{
MapWorld=c.Resolve(新名称参数(“CanResolveIMapWorld”,true))
});
每当有人试图正常解析IMapWorld,而不指定任意参数时,它都会抛出
不是最干净的解决方案,但应防止意外的设计破坏。可以通过添加自定义注册扩展方法对其进行一些修饰。Autofac没有一流的功能可以做到这一点,但您可以使用键控功能在某种程度上做到这一点
builder.RegisterType<MapWorld>().Keyed<IMapWorld>(typeof(IMapComposition));
解决它们之间的依赖关系。Autofac没有一流的功能可以做到这一点,但您可以使用键控功能以某种方式做到这一点
builder.RegisterType<MapWorld>().Keyed<IMapWorld>(typeof(IMapComposition));
解决他们的依赖关系