Unity RegisterType()错误:没有隐式引用转换

时间:2018-07-20 11:01:52

标签: c# .net unity-container covariance contravariance

我有一个界面:

    public interface IFileRetriever<THeader, TBody, TTailer>
        where THeader : IFileRow
        where TBody : IFileRow
        where TTailer : IFileRow {

        IRetrievedFile<THeader, TBody, TTailer> Retrieve(string fileName); 
}

这是一个子类:

public class FileRetriever<THeader, TBody, TTailer> : IFileRetriever<THeader, TBody, TTailer>
    where THeader : IFileRow, new()
    where TBody : IFileRow, new()
    where TTailer : IFileRow, new()
{
    private readonly IRetrievedFile<THeader, TBody, TTailer> retrievedFile;

    public FileRetriever(IRetrievedFile<THeader, TBody, TTailer> retrievedFile)
    {
        this.retrievedFile = retrievedFile;
    }

    public IRetrievedFile<THeader, TBody, TTailer> Retrieve(string fileName)
    {
        //do some thing
       return null;
    }
}

当我尝试在Unity中注册时,

    container.RegisterType<IFileRetriever<IFileRow, IFileRow, IFileRow>, FileRetriever<ReturnCheckHeader, ReturnCheckBody, ReturnCheckTailer>>(
        new InjectionConstructor(
            new ResolvedParameter<IRetrievedFile<ReturnCheckHeader, ReturnCheckBody, ReturnCheckTailer>>()
        ));

ReturnCheckHeader,ReturnCheckBody,ReturnCheckTailer是“ IFileRow”的子类

我得到一个错误:

  

类型'FileRetriever'不能用作类型参数'TTo'   通用类型或方法'UnityContainerExtensions.RegisterType(IUnityContainer,params InjectionMember [])'。没有隐含   从“ FileRetriever”到“ IFileRetriever”的引用转换。

1 个答案:

答案 0 :(得分:0)

你不能只是做

var container = new UnityContainer();

//ensure the repository is disposed after each request by using the lifetime manager
container.RegisterType<IFileRetriever, FileRetriever>(new HierarchicalLifetimeManager());

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

我以前从未使用过像您这样的构造,但是我认为您不需要声明所有子参数。

相关问题