Autofac:如何动态注册具有泛型的具体类型及其自己的泛型类型接口

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

AutoFac 新手来了!我有几种采用泛型的类型,每种类型都有自己的接口,采用相同的泛型。例如:

public class Foo<T> : IFoo<T>
{
   ...
}

public class Bar<T> : IBar<T>
{
   ...
}

我正在尝试使用 AutoFac 注册这些,但我无法让它们注册并以动态方式解析。

我想我会尝试一个相当标准的注册,例如:

containerBuilder.RegisterAssemblyTypes(assemblies.ToArray())
    .Where(x => x.GetConstructors().Any(c => c.IsPublic))
    .AsImplementedInterfaces()
    .AsSelf();

如果我调试和检查容器,我可以看到注册。但如果我尝试解决该服务,它找不到它:

var x = _container.Resolve<IFoo<MyGenericType>>();

很公平,也许它不知道如何解决它。

我查看了containerBuilder.RegisterAssemblyTypes(),但我的类型并不都继承自单个泛型类型接口,所以我不确定如何解决这个问题?

我可以手动注册它们并且它可以工作:

containerBuilder.RegisterGeneric(typeof(Foo<>)).As(typeof(IFoo<>));
containerBuilder.RegisterGeneric(typeof(Bar<>)).As(typeof(IBar<>));

但是有没有办法使用 AutoFac 动态地执行此操作?

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

通过反射和通用接口

using System.Reflection;
interface IFoo<T> : IInjectable
{

}

interface IBar<T> : IInjectable
{

}
interface IInjectable
{

}

class Foo<T> : IFoo<T>
{

}

class Bar<T> : IFoo<T>
{

}
class Program
{
    static void Main(string[] args)
    {
        var types = Assembly.GetExecutingAssembly().GetTypes().Where(x => typeof(IInjectable).IsAssignableFrom(x));
        foreach (var type in types.Where(t => t.IsClass))
        {
            Console.WriteLine(type.FullName);
        }
        Console.ReadKey();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.