使用Unity将引用类型传递给泛型方法

时间:2017-04-25 00:35:51

标签: c# generics dependency-injection inversion-of-control unity-container

好的,这让我抓狂!我在泛型类中有一个泛型方法。

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?我想从客户端代码中获取该依赖关系。

1 个答案:

答案 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表示法