使用 Unity 将引用类型传递给泛型方法
Passing a reference type to generic method with Unity
好吧,这让我发疯!我在泛型 class 中有一个泛型方法。
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?我想从客户端代码中删除该依赖项。
您的 parseCSV
方法存在依赖关系。因此,您也应该将其注入到 class 中。有很多方法可以做到这一点,但我更喜欢,而且我看到许多其他开发人员也更喜欢构造函数注入。
因此,您只需要一个接口,然后将实现该接口的 class 实例注入到您的构造函数中,如下所示:
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!");
}
}
这实际上很好,因为现在您可以在对 Handler<T>
class.
进行单元测试时模拟 IFileHelperEngine
仅供参考,您没有使用 .NET 命名约定;局部变量应使用 驼峰式大小写 表示法,方法名称应使用 Pascal 表示法.
好吧,这让我发疯!我在泛型 class 中有一个泛型方法。
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?我想从客户端代码中删除该依赖项。
您的 parseCSV
方法存在依赖关系。因此,您也应该将其注入到 class 中。有很多方法可以做到这一点,但我更喜欢,而且我看到许多其他开发人员也更喜欢构造函数注入。
因此,您只需要一个接口,然后将实现该接口的 class 实例注入到您的构造函数中,如下所示:
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!");
}
}
这实际上很好,因为现在您可以在对 Handler<T>
class.
IFileHelperEngine
仅供参考,您没有使用 .NET 命名约定;局部变量应使用 驼峰式大小写 表示法,方法名称应使用 Pascal 表示法.