Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果目标类型未实现特定接口,则使用Autofac throw_C#_Autofac - Fatal编程技术网

C# 如果目标类型未实现特定接口,则使用Autofac throw

C# 如果目标类型未实现特定接口,则使用Autofac throw,c#,autofac,C#,Autofac,使用Autofac,我注册了某个数据类型(IMapWorld的实现者)。我有一个特定的数据类型IMapComposition,从架构的角度来看,它允许获取IMapWorld的实例。如果其他任何人试图从Autofac容器中获取实例IfIMapWorld,我希望引发异常。换句话说,我想要这样的东西: builder.RegisterType<MapWorld>().As<IMapWorld>().ForInheritorsOf<IMapComposition>()

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

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));
解决他们的依赖关系