使用 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 表示法.