好吧,这简直快把我逼疯了!我在泛型类中有一个泛型方法。
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中解析。
有人知道如何使用统一将Mapper对象传递给FileHelperEngine吗?我想从客户端代码中获得这种依赖。
发布于 2017-04-25 01:07:32
在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>
。
FYI,您没有使用.NET命名约定;局部变量应该使用camel case表示法,方法名称应该使用Pascal表示法。
https://stackoverflow.com/questions/43599709
复制相似问题