我正在使用Autofac。假设我有一个协变接口
interface IOptionFactory<out T> where T : IOption
和特定的实现方式
class Option1Factory : IOptionFactory<Option1>
class Option2Factory : IOptionFactory<Option2>
我将其注册为
container.RegisterType<Option1Factory>.As<IOptionFactory<Option1>>();
container.RegisterType<Option2Factory>.As<IOptionFactory<Option2>>();
有没有办法解决IOptionFactory的所有实现?因为这是协变的,所以这在C#中应该合法(对吗?)。像这样:
var factories = container.Resolve<IEnumerable<IOptionFactory<IOption>>>();
答案 0 :(得分:1)
最好的解决方案是将代码包装在具有Reporting
的私有IEnumerable
属性的IOptionFactory<IOption>
类中。
private class Reporting
{
private IEnumerable<IOptionFactory<IOption>> _allOptionsFactories;
public Reporting(IEnumerable<IOptionFactory<IOption>> allOptionsFactories)
{
if (allOptionsFactories == null)
{
throw new ArgumentNullException("Parameter:" + nameof(allOptionsFactories));
}
this._allOptionsFactories = allOptionsFactories;
}
public void Report()
{
foreach (var optionsFactories in _allOptionsFactories)
{
Console.WriteLine(optionsFactories.GetType());
}
}
}
然后您可以将其注册并使用:
[TestMethod]
public void PassingParametersToRegister_NamedParameter()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<IOption1Factory1<SomeOption>>().As<IOptionFactory<IOption>>();
builder.RegisterType<IOption1Factory2<SomeOption>>().As<IOptionFactory<IOption>>();
builder.RegisterType<Reporting>();
using (var container = builder.Build())
{
container.Resolve<Reporting>().Report();
}
//OUTPUT:
//Enumerations + IOption1Factory1`1[Enumerations + SomeOption]
//Enumerations + IOption1Factory2`1[Enumerations + SomeOption]
}
这是我的github
中的全部代码