我不确定这是否可能,我看到其他一些帖子问过类似的问题,但没有一个有令人满意的答案。
我想做的是从 Autofac 解析具有不同泛型类型的接口(interface)集合。所以类的构造函数看起来像这样:
public class SomeClass<T> where T : class
{
private readonly IEnumerable<ITestInterface<T>> _testInterfaces;
public SomeClass(IEnumerable<ITestInterface<T>> testInterfaces)
{
_testInterfaces = testInterfaces;
}
}
理想情况下,我希望能够像这样单独注册每个实例:
builder
.RegisterType<ImplementationA>()
.As<ITestInterface<A>>();
builder
.RegisterType<ImplementationB>()
.As<ITestInterface<B>>();
我已经尝试了 RegisterGeneric
等的各种组合,但 Enumerable 一直都是空的。
如有任何帮助,我们将不胜感激。
最佳答案
在尝试继承和通用约束后,我能够解决这个问题。我最终得到的解决方案如下所示:
基类/接口(interface):
public abstract class BaseClass
{
public abstract string IAM { get; }
}
public interface ITestInterface<out T> where T : BaseClass
{
T GetSomething();
}
实现类:
public class A : BaseClass
{
public override string IAM => "I AM TYPE A";
}
public class AInterface : ITestInterface<A>
{
public A GetSomething()
{
return new A();
}
}
public class B : BaseClass
{
public override string IAM => "I AM TYPE B";
}
public class BInterface : ITestInterface<B>
{
public B GetSomething()
{
return new B();
}
}
我们要解析的类:
public interface ISomeClass
{
void DoSomething();
}
public class SomeClass<T> : ISomeClass where T : BaseClass
{
private readonly IEnumerable<ITestInterface<T>> _testInterfaces;
public SomeClass(IEnumerable<ITestInterface<T>> testInterfaces)
{
_testInterfaces = testInterfaces;
}
public void DoSomething()
{
foreach (var t in _testInterfaces)
{
var something = t.GetSomething();
Console.WriteLine(something.IAM);
}
}
}
最后,Autofac 配置:
var builder = new ContainerBuilder();
builder
.RegisterType<SomeClass<BaseClass>>()
.AsSelf();
builder
.RegisterType<AInterface>()
.As<ITestInterface<BaseClass>>();
builder
.RegisterType<BInterface>()
.As<ITestInterface<BaseClass>>();
builder
.RegisterType<SomeClass<BaseClass>>()
.As<ISomeClass>();
var container = builder.Build();
var x = container.Resolve<ISomeClass>();
x.DoSomething();
输出:
I AM TYPE A
I AM TYPE B
希望这对以后的人有帮助。
关于c# - 从 Autofac 容器解析通用接口(interface)的 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801361/