簡體   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