我有两个界面:
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
的实现?
经过数小时的尝试和谷歌搜索,我找到了答案。我做的一切正确,除了一件事:使IDataFetcher
协变:
public interface IDataFetcher<out T> where T : IResult
{}
这很合理,因为我在泛型类型中使用了具体类型:
public class SomeClass : IResult
{
}
public class ConcreteFetcher : IDataFetcher<SomeClass>
{
public SomeClass Fetch()
{
// do something
}
}
干杯!