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

问题描述 投票:-1回答:1

如何从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();
        }
    }

因为.Activator.LimitType返回了在容器中使用的A类型的IA插入,我得到了异常

Autofac.Core.Registration.ComponentNotRegisteredException : The requested service 'A' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

c# .net autofac
1个回答
0
投票

一种方法是确保您的寄存器A不仅针对IA,还针对also针对IBase(与B相同)。

然后解析IEnumerable<IBase>将同时找到AB

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());
        }

    }
}

由于上面找到了两个匹配项,因此上面将2写入控制台。

© www.soinside.com 2019 - 2024. All rights reserved.