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 动态地执行此操作?
通过反射和通用接口
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();
}
}