我有两个界面:
public interface IResult
{}
public interface IDataFetcher<T> where T : IResult
{
T Fetch();
}
在我的处理程序中,我想注入实现IDataFetcher<T>
的服务:
public class MyHandler
{
public MyHandler(IEnumerable<IDataFetcher<IResult>> fetchers)
{
// etc.
}
}
我目前正在按以下方式注册IDataFetchers
:
public MyRegistry()
{
Scan(scan =>
{
scan.Assembly("name_of_assembly_containg_all_the_classes");
scan.AddAllTypesOf<IResult>();
scan.ConnectImplementationsToTypesClosing(typeof(IDataFetchers<>));
});
}
当我在MyHandler
的构造函数中设置断点时,fetchers
变量为空(不为null)
该如何解决?要确保抓取程序充满了IDataFetcher
的实现?
答案 0 :(得分:1)
经过数小时的尝试和谷歌搜索,我找到了答案。除了一件事情,我一切都做对了:使IDataFetcher
协变:
public interface IDataFetcher<out T> where T : IResult
{}
这很合理,因为我在泛型类型中使用了具体类型:
public class SomeClass : IResult
{
}
public class ConcreteFetcher : IDataFetcher<SomeClass>
{
public SomeClass Fetch()
{
// do something
}
}
干杯!