.net 基于通用接口和具体类型的Autofac注入

.net 基于通用接口和具体类型的Autofac注入,.net,generics,inversion-of-control,autofac,.net,Generics,Inversion Of Control,Autofac,我有以下接口 public interface ICheckEvaluator<in TCheck> where TCheck : ResourceCheck 以下方法不起作用: builder.RegisterType<OutageCheckEvaluator>().As<ICheckEvaluator<OutageCheck>>(); builder.RegisterType().As(); 由于Autofac收到要实施的ICheckEv

我有以下接口

public interface ICheckEvaluator<in TCheck> where TCheck : ResourceCheck
以下方法不起作用:

builder.RegisterType<OutageCheckEvaluator>().As<ICheckEvaluator<OutageCheck>>();
builder.RegisterType().As();
由于Autofac收到要实施的ICheckEvaluator(ResourceCheck),因此无法将其与ICheckEvaluator(OutageCheck)匹配


感谢您的建议。

您可以使用反射等方法解决这些
评估者的问题

public class AutofacTest
{
    [Test]
    public void Test()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<OutageCheckEvaluator>().As<ICheckEvaluator<OutageCheck>>();
        var container = builder.Build();

        var listOfChecks = new List<ResourceCheck> { new OutageCheck() };
        foreach (var check in listOfChecks)
        {
            var interfaceType = typeof(ICheckEvaluator<>).MakeGenericType(check.GetType());
            var evaluator = container.Resolve(interfaceType);
            Debug.WriteLine(evaluator);
        }
    }
}

public interface ICheckEvaluator<in TCheck> where TCheck : ResourceCheck { }

public class OutageCheckEvaluator : ICheckEvaluator<OutageCheck> { }

public class OutageCheck : ResourceCheck { }

public class ResourceCheck{}
public class AutofacTest
{
[测试]
公开无效测试()
{
var builder=new ContainerBuilder();
builder.RegisterType().As();
var container=builder.Build();
var listOfChecks=新列表{new OutageCheck()};
foreach(风险值签入检查列表)
{
var interfaceType=typeof(icheckeevaluator).MakeGenericType(check.GetType());
var evaluator=container.Resolve(interfaceType);
Debug.WriteLine(evaluator);
}
}
}
公共接口ICheckEvaluator,其中TCheck:ResourceCheck{}
公共类OutageCheckEvaluator:ICheckeEvaluator{}
公共类OutageCheck:ResourceCheck{}
公共类ResourceCheck{}
但问题是,由于泛型参数是逆变的,所以不能执行任何这些类型转换

var test = new OutageCheck() as ICheckEvaluator<ResourceCheck>;
var evaluator = container.Resolve(interfaceType) as ICheckEvaluator<ResourceCheck>;
var test=new OutageCheck()作为ICheckEvaluator;
var evaluator=container.Resolve(interfaceType)作为icheckeevaluator;

您是否需要使用
ICheckeEvaluator
而不是
ICheckeEvaluator

我收到一个错误,OutageCheckEvaluator无法转换为ICheckeEvaluator。您能否提供更多的代码示例来重现该错误?很抱歉,我的问题是我没有像您在测试中那样解析对象。我有一个运行的列表,对于其中的每一个,我都实例化一个工厂,尝试创建一个Evaluator对象。在代码运行之前,我不知道每个ResourceCheck的类型。我确实需要使用Contrarance,但发现这篇文章有助于强制转换:
public class AutofacTest
{
    [Test]
    public void Test()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<OutageCheckEvaluator>().As<ICheckEvaluator<OutageCheck>>();
        var container = builder.Build();

        var listOfChecks = new List<ResourceCheck> { new OutageCheck() };
        foreach (var check in listOfChecks)
        {
            var interfaceType = typeof(ICheckEvaluator<>).MakeGenericType(check.GetType());
            var evaluator = container.Resolve(interfaceType);
            Debug.WriteLine(evaluator);
        }
    }
}

public interface ICheckEvaluator<in TCheck> where TCheck : ResourceCheck { }

public class OutageCheckEvaluator : ICheckEvaluator<OutageCheck> { }

public class OutageCheck : ResourceCheck { }

public class ResourceCheck{}
var test = new OutageCheck() as ICheckEvaluator<ResourceCheck>;
var evaluator = container.Resolve(interfaceType) as ICheckEvaluator<ResourceCheck>;