好的,这让我抓狂!我在泛型类中有一个泛型方法。
public interface IHandler<T> where T : class
{
T[] parseCSV(string InputFileName)
}
public class Handler<T> : IHandler<T> where T : class
{
public T[] parseCSV(string InputFileName)
{
if (File.Exists(InputFileName))
{
_inputFileName = InputFileName;
var Engine = new FileHelperEngine<T>();
return Engine.ReadFile(_inputFileName);
}
else
{
throw new IOException($"{InputFileName} not found!");
}
}
}
我已在IoC容器中注册了通用程序:
container.RegisterType(typeof(IHandler<>), typeof(Handler<>));
与几个映射器一起使用FileHelpers包解析文件
container.RegisterType<IMapper1, Mapper1>();
container.RegisterType<IMapper2, Mapper2>();
container.RegisterType<IMapper3, Mapper3>();
我的容器对于我的大多数应用都是合法的,我可以设置IHandler对象。
IHandler<IMapper1> Handler1 = container.Resolve<IHandler<IMapper1>>();
但是,我无法弄清楚如何将IMapper1对象传递给通用parseCSV方法,因此它将在FileHelperEngine中解析。
有没有人知道如何使用Unity将Mapper对象传递给FileHelperEngine?我想从客户端代码中获取该依赖关系。
答案 0 :(得分:1)
您的parseCSV
方法中存在依赖关系。因此,您也应该将它注入您的班级。有很多方法可以做到这一点,但我更喜欢,而且我已经看到许多其他开发者也更喜欢构造函数注入。
因此,您只需要一个接口,然后将一个实现接口的类的实例注入到构造函数中,如下所示:
public interface IFileHelperEngine<T> where T : class
{
T[] ReadFile(string inputFileName);
}
public class Handler<T> : IHandler<T> where T : class
{
private IFileHelperEngine<T> fileHelperEngine;
public Handler(IFileHelperEngine<T> fileHelperEngine) //<----See this.
{
this.fileHelperEngine = fileHelperEngine;
}
public T[] parseCSV(string InputFileName)
{
if (File.Exists(InputFileName))
{
_inputFileName = InputFileName;
return this.fileHelperEngine.ReadFile(_inputFileName); //<--and this
}
throw new IOException($"{InputFileName} not found!");
}
}
这实际上很好,因为现在你可以在单元测试IFileHelperEngine
类时模拟Handler<T>
。
仅供参考,您没有使用.NET命名约定;本地人员应使用驼峰式表示法,方法名称应使用 Pascal表示法。