DryIOC: Регистрация универсального типа выдает: Тип реализации не указан при использовании автоматического выбора конструктора

Я хочу зарегистрировать общий базовый репозиторий, который принимает объект и ключ объекта, у меня есть IBaseRepo и его реализация. Я использовал эту строку кода ниже

container.Register(typeof(IRepository<,>), typeof(RepositoryBase<,>),
    made: FactoryMethod.ConstructorWithResolvableArgumentsIncludingNonPublic);

но я получаю ошибку ниже

InvalidOperationException: Произошла ошибка при попытке создать контроллер типа «ValuesController». Убедитесь, что у контроллера есть публичный конструктор без параметров.

at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",

Внутреннее исключение:

DryIoc.ContainerException: тип реализации не указан при использовании автоматического выбора конструктора: IRepository {ReturnDefault} в качестве параметра «пользователь»

в UserRepository: IUserRepository {ReturnDefault} в качестве параметра "репозиторий"

в ограниченном ValuesController {ServiceKey=DefaultKey(0), ReturnDefault}

at DryIoc.Throw.ThrowIfNull[T](T arg, Int32 error, Object arg0, Object arg1, Object arg2, Object arg3) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxx\\xxx\\DryIoc\\Container.cs:line 11562
at DryIoc.FactoryMethod.<>c__DisplayClass5_0.<Constructor>b__0(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 4426
at DryIoc.ReflectionFactory.ClosedGenericFactoryGenerator.GetGeneratedFactory(Request request, Boolean ifErrorReturnDefault) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8866
at DryIoc.Container.DryIoc.IContainer.ResolveFactory(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 852
at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8713
at DryIoc.Factory.GetExpressionOrDefault(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8038
at DryIoc.ReflectionFactory.CreateExpressionOrDefault(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8714
at DryIoc.Factory.GetExpressionOrDefault(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8038
at DryIoc.Factory.GetDelegateOrDefault(Request request) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 8162
at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, Boolean ifUnresolvedReturnDefault, Type requiredServiceType, RequestInfo preResolveParent, IScope scope) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 524
at DryIoc.Container.ResolveAndCacheDefaultDelegate(Type serviceType, Boolean ifUnresolvedReturnDefault) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 563
at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Boolean ifUnresolvedReturnDefault) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\Container.cs:line 477
at DryIoc.WebApi.DryIocDependencyScope.GetService(Type serviceType) in C:\\Users\\Workload\\documents\\visual studio 2017\\Projects\\xxxxxx\\xxxxxx\\DryIoc\\WebApi\\DryIocWebApi.cs:line 216
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)

person Kemi Awosile    schedule 09.09.2017    source источник
comment
Я отформатировал исключение для вас. Пожалуйста, позаботьтесь о своем вопросе и убедитесь, что информация об исключении правильно отформатирована.   -  person Steven    schedule 09.09.2017
comment
Может быть RepositoryBase это абстрактный класс?   -  person dadhi    schedule 10.09.2017
comment
@dadhi да, это абстрактный класс   -  person Kemi Awosile    schedule 10.09.2017
comment
@ Стивен, спасибо, в следующий раз приму к сведению.   -  person Kemi Awosile    schedule 10.09.2017


Ответы (1)


RepositoryBase<> является абстрактным классом и поэтому не может использоваться для реализации службы. IoC - это не волшебство (по крайней мере, DryIoc) и не может создать для вас абстрактный класс.

Вам необходимо предоставить неабстрактный тип реализации, чтобы этот код работал.

person dadhi    schedule 10.09.2017