У меня есть DI Autofac в моем проекте WebApi. 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
{ }
public 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]' можно вызвать с помощью доступных служб и
параметры:
Не удается разрешить параметр «DPB dPB» конструктора «Void .ctor (IFO, DPB)».
Интересно, потому что эти отображения работали в Unity (портированный проект).
Редактировать 1
Если я вас правильно понимаю, мой ответ - да.
Я хотел бы разрешить любой ROD<T>
сервис, который реализует IDPB
. Как и в этом сценарии, ROD<T>
должно быть разрешено DPB, начиная с 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 для этого контроллера - хост: порт / api / ro / convert
Редактировать 3
Я добавил builder.RegisterType (); и это сработало.