Я пытаюсь зарегистрировать мой репозиторий с помощью Autofac, но у меня есть проблема. Вот что я продюсировал до сих пор:Как зарегистрировать общую реализацию универсального интерфейса с помощью Autofac?
ContainerModule.cs
public class ContainerModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<XmlDataProvider>().As<IDataProvider>();
builder.RegisterGeneric(typeof (TemplateRepository<,>)).As(typeof (IRepository<>)).SingleInstance();
}
}
TemplateRepository {T} .cs
public class TemplateRepository<TTemplate, TEntity> : IRepository<TTemplate> where TTemplate : ITemplate
{
public TemplateRepository(IDataProvider dataProvider)
{
}
}
[место, когда я пытаюсь решить это]
var markerRepository = container.Resolve<IRepository<MarkerTemplate>>();
Проблема в том, что Autofac даже не пытается создать мой репозиторий (я поставил там точку останова, и он никогда не попадал). Я получаю следующее исключение:
Исключение типа «Autofac.Core.Registration.ComponentNotRegisteredException» произошло в Autofac.dll, но не был обработан в пользовательском коде Дополнительная информация: запрашиваемая услуга «**** *****. Logic.Web.Repository.IRepository`1 [[*********. Template.MarkerTemplate, *********. Logic.Web, Version = 1.0.0.0 , Culture = neutral, PublicKeyToken = null]] 'не зарегистрировано. Чтобы избежать этого исключения, зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered() или используйте метод ResolveOptional() для разрешения дополнительной зависимости.
Я попытался изменить свой регистрационный код на что-то более конкретное, но затем я получаю другое исключение, говорящее, что TEntity
не является открытым интерфейсом.
Я пробовал несколько решений, найденных здесь, но ни один из них не работает. У вас есть идея, почему я не могу зарегистрировать такой случай?
Да, я это понимаю, что второй параметр может быть недопонимание для Autofac, но это какая-то возможность сказать контейнер, который общий для использования? – Fka
Nope - @Alexey прав. Вам нужно предоставить оба генерика, чтобы он мог быть закрытым типом, который должен быть разрешен. Вы не можете передать параметр типового типа в качестве параметра для вызова разрешения. –