c# - Autofac - 解决不太具体的协变实现
问题描述
我正在使用 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>>>();
解决方案
最好的解决方案是将您的代码包装在一个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中的全部代码
推荐阅读
- google-apps-script - 如何仅获取要在文件名中使用的单元格值的日期部分?
- hdfs - How to move deleted HDFS file into the Previous location
- python-3.x - 带有pycharm的Windows 10上python 3.7 / 3.8的dlib(最新版本)安装错误 - 已解决
- powershell - 获取 HTTP 状态代码:使用带有 AzureRm 模块的 PowerShell 创建 Azure 数据工厂触发器时出现 BadRequest
- data-annotations - 使用 efcore .netcore 将关键数据注释分配给我的 razor Web 应用程序中的单独部分类时不起作用
- java-8 - 如何在 Java 7 中将 ZonedDateTime 转换为 XMLGregorianCalendar
- android - Cannot resolve symbol 'cat_item_layout' in Android Studio
- c# - 如何在一个变量中注册多个值?
- python - Python 脚本服务在 ID 为 7039 的事件日志中生成警报
- angular - 具有 NGXS Facades 模式的动态 @Selector