我有一堆数据获取器,它们都有几乎相同的签名。唯一不同的是返回类型。返回类型被指定为T。
我有这个接口
public interface IDataFetcher<T>
{
T FetchData(MyObject data);
}
接下来我有10个接口的实现。在de调用代码中,我想做这样的事情。
public class FetchCommandHandler
{
private readonly IEnumerable<IDataFetcher<T>> _fetchers;
public FetchCommandHandler(IEnumerable<IDataFetcher<T>> fetchers) // this of course does not work
{
_fetchers = fetchers;
}
public MyResult Handle()
{
var myObj = new MyObject(); // get object from database
foreach(var fetcher in _fetchers)
{
var result = fetcher.FetchData(myObj);
// do something with result
}
}
}
所以,最后,我想做的是不需要把每一个接口都注入 DataFetcher<T>
在构造函数中实现。我正在寻找一种方法来恢复所有的 IDataFetcher<T>
从StructureMap。
我对其他所有能达到同样效果的设计都持开放态度,即不在构造函数中注入每个实现。
我们可以做的是为返回类型引入另一个接口,所有返回的类型都将实现它。
定义一个接口 。
public interface IData
{
}
public interface IDataFetcher<T> where T : IData
{
T FetchData(MyObject data);
}
作为一个例子,一个将被返回的类型。
public class FooData : IData
{
}
它的DataFetcher实现将是这样的。
public class FooDataFetcher : IDataFetcher<FooData>
{
public FooData FetchData(MyObject data)
{
// logic here and return instance of FooData
}
}
现在我们可以做的是定义一个类似于Handler类的东西:
public class FetchCommandHandler
{
private readonly IEnumerable<IDataFetcher<IData>> _fetchers;
public FetchCommandHandler(IEnumerable<IDataFetcher<IData>> fetchers) // this of course does not work
{
_fetchers = fetchers;
}
public MyResult Handle()
{
var myObj = new MyObject(); // get object from database
foreach(var fetcher in _fetchers)
{
var result = fetcher.FetchData(myObj);
// do something with result
}
}
}