Autofac: регистрация вложенных универсальных интерфейсов и классов - PullRequest
0 голосов
/ 09 января 2019

У меня есть 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 (); и это сработало.

1 Ответ

0 голосов
/ 10 января 2019

Исключение гласит, что Autofac ищет тип с именем DPB в конструкторе ROD<T>, но для DPB регистрации нет. Однако есть регистрация для IDPB, которая отображает на DPB. Вы хотели позволить ROD<T> зависеть от IDPB вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...