Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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注册中获取类型_C#_.net_Autofac - Fatal编程技术网

C# 如何从用于注册的Autofac注册中获取类型

C# 如何从用于注册的Autofac注册中获取类型,c#,.net,autofac,C#,.net,Autofac,如何从container.ComponentRegistry.Registrations获取用于在容器中注册类的类型 // I have some types like interface IBase { } interface IA : IBase { } interface IB : IBase { } class A : IA { } class B : IB { } class Program { st

如何从
container.ComponentRegistry.Registrations
获取用于在容器中注册类的类型

    // I have some types like

    interface IBase { }
    interface IA : IBase { }
    interface IB : IBase { }

    class A : IA { }
    class B : IB { }

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();

            // Registering types as interface implementations
            builder.RegisterType<A>().As<IA>();
            builder.RegisterType<B>().As<IB>();

            var c = builder.Build();


            // Trying to get all registered types assignable to IBase
            var types = c.ComponentRegistry.Registrations
                .Where(r => typeof(IBase).IsAssignableFrom(r.Activator.LimitType))
                .Select(r => r.Activator.LimitType); // Returns A insted of IA

            // Trying to Resolve all types
            types.Select(t => c.Resolve(t) as IBase).ToList();
        }
    }
//我有一些类型
接口IBase{}
接口IA:IBase{}
接口IB:IBase{}
A类:IA{}
B类:IB{}
班级计划
{
静态void Main(字符串[]参数)
{
var builder=new ContainerBuilder();
//将类型注册为接口实现
builder.RegisterType().As();
builder.RegisterType().As();
var c=builder.Build();
//正在尝试获取可分配给IBase的所有注册类型
变量类型=c.ComponentRegistry.Registrations
.Where(r=>typeof(IBase).IsAssignableFrom(r.Activator.LimitType))
.Select(r=>r.Activator.LimitType);//返回一个替代的IA
//尝试解析所有类型
选择(t=>c.Resolve(t)作为IBase.ToList();
}
}
因为
.Activator.LimitType
返回类型
A
而不是容器中使用的类型
IA
,所以我得到了一个异常


Autofac.Core.Registration.ComponentNotRegisteredException:请求的服务“A”尚未注册。要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解决可选依赖项。

一种方法是确保您的注册
a
不仅针对
IA
,而且针对
IBase
(对于
B
)也是如此

然后解析
IEnumerable
将找到
A
B

using System;
using System.Collections.Generic;
using System.Linq;
using Autofac;

namespace WatCode
{
    interface IBase { }
    interface IA : IBase { }
    interface IB : IBase { }

    class A : IA { }
    class B : IB { }

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();

            // Registering types as interface implementations
            builder.RegisterType<A>().AsImplementedInterfaces(); // register against IA and IBase
            builder.RegisterType<B>().AsImplementedInterfaces(); // register against IB and IBase

            var c = builder.Build();

            var matching = c.Resolve<IEnumerable<IBase>>();

            Console.WriteLine(matching.Count());
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用Autofac;
命名空间代码
{
接口IBase{}
接口IA:IBase{}
接口IB:IBase{}
A类:IA{}
B类:IB{}
班级计划
{
静态void Main(字符串[]参数)
{
var builder=new ContainerBuilder();
//将类型注册为接口实现
builder.RegisterType().AsImplementedInterfaces();//根据IA和IBase注册
builder.RegisterType().AsImplementedInterfaces();//根据IB和IBase注册
var c=builder.Build();
变量匹配=c.Resolve();
Console.WriteLine(匹配.Count());
}
}
}

上面将向控制台写入
2
,因为它找到了两个匹配项。

定义“它根本不工作”。具体发生了什么?你能提供一个吗?它抛出一个异常。添加了有问题的可用代码。