2014-09-30 4 views
0

Я пытаюсь зарегистрировать/разрешить общий тип в Autofac, который получает параметр типа, который является интерфейсом и уже зарегистрирован.Autofac разрешает общий тип с интерфейсом как параметр

У меня есть следующие:

public interface IBaseEntity 
{ 

} 

public partial interface IRepository<T> 
    where T : IBaseEntity 
{ 

} 

public class NhRepository<T> : IRepository<T> 
    where T : IBaseEntity 
{ 

} 

public interface IEntity : IBaseEntity 
{ 

} 

public class Entity : IEntity 
{ 

} 

Регистрация:

//registering type  
builder.RegisterType<Entity>().As<IEntity>(); 

//registering generic type in Autofac 
builder.RegisterGeneric(typeof(NhRepository<>)) 
    .As(typeof(IRepository<>)).InstancePerRequest(); 

Попытка решить:

//the code below returns NhRepository<IEntity>(). 
_containerManager.Resolve<IRepository<IEntity>>(); 

Я хочу способ получить NhRepositoy<Entity> вместо NhRepository<IEntity>()

Любая идея?

ответ

0

У меня была аналогичная проблема, скорее всего, по той же причине, что и у вас, т. Е. Потому, что Entity Framework не может работать с интерфейсами. Я решил это, используя метод OnActivating Autofac see documentation here, чтобы найти этот тип, а затем вызвать метод внутри нового экземпляра для установки типа.

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

  1. Устраните IEntity к Entity класса
  2. Создание универсального класса самостоятельно.

Ответ на первый в моем stackoverflow post, поэтому я не буду повторять его здесь.

Второй довольно простой. Вам нужно использовать метод .NET MakeGenericType для создания класса, в вашем случае код будет чем-то вроде.

e.ReplaceInstance(typeof(NhRepository<>).MakeGenericType(new []{resolvedType})); 

где resolvedType заменяется командой foundEntry.Activator.LimitType от моего решения. Надеюсь, это имеет смысл.

+0

Это не работает, поскольку вы не можете отличать NhRepository от IRepository , независимо от классов, реализующих соответствующие интерфейсы. –

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