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
,因为它找到了两个匹配项。定义“它根本不工作”。具体发生了什么?你能提供一个吗?它抛出一个异常。添加了有问题的可用代码。