繁体   English   中英

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

[英]Autofac: Registering nested generic Interfaces and classes

我的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>();

以下错误如下。

在类型为'ROD`1 [DPB]'上的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'中找不到的构造函数,无法使用可用的服务和参数调用:无法解析构造函数'Void .ctor的参数'DPB dPB' (IFO,DPB)”。

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

编辑1

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

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

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

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

编辑3

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM