2015-08-18 3 views
0

Я пытаюсь зарегистрировать мой репозиторий с помощью 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 не является открытым интерфейсом.

Я пробовал несколько решений, найденных здесь, но ни один из них не работает. У вас есть идея, почему я не могу зарегистрировать такой случай?

ответ

2

У вас есть общая реализация, которая имеет два типа типовых параметров, и вы регистрируете ее как интерфейс с одним общим параметром типа. Как вы думаете, что Autofac будет определять второй тип параметра вашего общего назначения (TEntity)?

у меня есть это, и это прекрасно работает:

public class RavenRepository<T> : IRepository<T> where T : Entity 

... 

builder.RegisterGeneric(typeof (RavenRepository<>)) 
    .AsSelf() 
    .AsImplementedInterfaces() 
    .InstancePerRequest(); 
+0

Да, я это понимаю, что второй параметр может быть недопонимание для Autofac, но это какая-то возможность сказать контейнер, который общий для использования? – Fka

+0

Nope - @Alexey прав. Вам нужно предоставить оба генерика, чтобы он мог быть закрытым типом, который должен быть разрешен. Вы не можете передать параметр типового типа в качестве параметра для вызова разрешения. –

Смежные вопросы