[英]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.