Autofac:注册嵌套的通用接口和类

时间:2019-01-09 17:34:50

标签: c# asp.net-web-api dependency-injection autofac

我的WebApi项目中有一个DI Autofac。 Autofac无法解决。我想实现一种情况,当我可以创建实现`IDB的新接口以提供覆盖某些方法的新子类时。我还希望将来用某些继承的类替换DPB。

这是代码结构:

[RoutePrefix("api/ro")]
public class RODController : ApiController
{
    public RODController(IFO fO, IROD<IDPB> rOD)
    {
        _fO = fO ?? throw new ArgumentNullException(nameof(fO));
        _rOD = rOD ?? throw new ArgumentNullException(nameof(rOD));
    }
}

public interface IROD<T> : IDB<T> where T : IDPB
{ }

public class ROD<T> : DB<T>, IROD<IDPB> where T : IDP
{
    public ROD(IFO fO, T dPB) : base(fO, dPB)
    { }
}

public interface IDB<T> : IDF where T : IDPB
{ }

public abstract class DB<T> : IDB<T> where T : IDPB
{
    protected DB(IFO fO, T dPB)
    {
        _fO = fO ?? throw new ArgumentNullException(nameof(fO));
        _dPB = dPB;
    }
}

public interface IDPB
{ }

public class DPB : IDPB
{ }

公共IDF-仅提供IDB实施的方法

我在下面尝试过代码,但没有成功

builder.RegisterType<FO>().As<IFO>().InstancePerRequest();
builder.RegisterGeneric(typeof(ROD<>))
    .As(typeof(IROD<>)).InstancePerDependency;
builder.RegisterGeneric(typeof(DB<>))
    .As(typeof(ID<>)).InstancePerDependency();
builder.RegisterType<DPB>().As<IDPB>().InstancePerDependency();

builder.RegisterType<ROD<DPB>>()
    .As<IROD<IDPB>>();

builder.RegisterType<DPB>().As<IDPB>();

以下错误附在下面。

  

没有发现以下构造函数   类型上的“ Autofac.Core.Activators.Reflection.DefaultConstructorFinder”   可以使用可用的服务调用“ ROD`1 [DPB]”,   参数:       无法解析构造函数'Void .ctor(IFO,DPB)'的参数'DPB dPB'。

我想知道,因为这些映射在Unity(移植的项目)中有效。

编辑1

如果我对您的理解正确,我的回答是。 我想解决实现ROD<T>的任何IDPB服务。就像在这种情况下,ROD<T>应该由来自builder.RegisterType<ROD<DPB>>().As<IROD<IDPB>>();的DPB来解决

IROD<IDPB>是一种通过不同的接口名称(不同于名称解析)来解析IDB<T>中任何依赖类的简单方法。

我可以通过简单的方式来解释我的需求是解决

builder.RegisterType<ROD<DPB>>().As<IROD<IDPB>>();

几年后的Unity <package id="Unity" version="4.0.1" targetFramework="net461" />,我写了这个与抽象类一起工作的代码。

container.RegisterType<IROD<IDPB>, ROD<DPB>>()

编辑2

我在https://github.com/fruex/StackOverflowAutofac的github上创建了一个项目,它会产生与上述相同的错误。

我还准备了一个直接生成错误(https://github.com/fruex/StackOverflowAutofac/blob/master/StackOverflowAutofacTest/RODControllerTests.cs)的测试。 该控制器的URL为host:port / api / ro / convert

编辑3

我添加了builder.RegisterType();而且有效。

1 个答案:

答案 0 :(得分:1)

该异常指出Autofac在DPB的构造函数中查找名为ROD<T>的类型,但是DPB没有注册。但是,IDPB有一个映射DPB的注册。您是要让ROD<T>依赖IDPB吗?