2012-02-16 1 views
0

Ад о,ошибки Единство во время конфигурации загрузки: Тип ObjectContext имеет несколько конструкторов длины 1. Невозможно неоднозначность

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

/* Generic репозиториев: */

public class Repository<E> : IRepository<E> where E : EntityObject 
{ 
    private readonly ObjectContext _ctx; 

    public ObjectContext Context 
    { 
     get { return _ctx; } 
    } 

    public Repository(ObjectContext context) 
    { 
     _ctx = context;    
    } 
} 

/* Бетонный хранилище: */

public class SourceRepository : Repository<Source> 
{ 
    public SourceRepository(EntityContext context) : base(context) { }  
} 

/* EF генерируется контекст: */

public partial class EntityContext : ObjectContext 
{ 
    public EntityContext() : base("name=EntityContext", "EntityContext") 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
     OnContextCreated(); 
    } 

    public EntityContext(string connectionString) : base(connectionString, "EntityContext") 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
     OnContextCreated(); 
    } 

    public EntityContext(EntityConnection connection) : base(connection, "EntityContext") 
    { 
     this.ContextOptions.LazyLoadingEnabled = true; 
     OnContextCreated(); 
    } 
} 

/* Регистрация типа EntityContext с конструктором без параметров */

<register type="ObjectContext" mapTo="EntityContext" name="EntityContext"> 
    <constructor/> 
</register> 

/* Регистрация для общего хранилища (я не уверен, что если эта регистрация не требуется) */

<register type="IRepository[]" mapTo="Repository[]" name="Repository"> 
    <lifetime type="transient" /> 
    <constructor> 
     <param name="context"> 
      <dependency name="EntityContext"/> 
     </param> 
    </constructor> 
</register> 

/* Регистрация для конкретного хранилища. Я хочу, чтобы придать конструктор зависимость типа EntityContext */

<register type="IRepository[Source]" mapTo="SourceRepository" name="SourceRepository"> 
    <lifetime type="transient" /> 
    <constructor> 
     <param name="context"> 
      <dependency name="EntityContext"/> 
     </param> 
    </constructor> 
</register> 

Когда я пытаюсь загрузить конфигурацию я получаю сообщение об ошибке:

Постановление зависимости не удалось, тип = «BL.DataAccess. Repository.SourceRepository ", name =" (none) ". Исключение произошло во время: при разрешении. Исключение: InvalidOperationException. Тип ObjectContext имеет несколько конструкторов длиной 1. Невозможно устранить неоднозначность.

Я понимаю, что это означает исключение, но я не знаю, где у меня ошибка в моей конфигурации.

Вы можете помочь с этим!

спасибо.

+0

EntityContext в разделе Указание типа параметра в конфигурации конструктора может сделать трюк. – GrantVS

+0

если вы имеете в виду это: <имя = типа пар "контекст" = "EntityContext"> <имя зависимость = "EntityContext" /> так это не помогло. Та же ошибка. – zosim

+0

Looks SourceRepository имеет только один составляющий. Можете ли вы попробовать тип t = typeof (SourceRepository); ConstructorInfo [] constructorInfos = t.GetConstructors(); чтобы проверить, сколько у него подрядчиков. – findcaiyzh

ответ

2

По внешнему виду, Resolve вызывается для неназванной регистрации для SourceRepository.

Либо убедитесь, что ваша конфигурация устанавливает все классы, которые зависят от SourceRepository, чтобы использовать правильную именованную регистрацию (через <param><dependency name="SourceRepository" /></param>).

Или удалить имя в регистрации хранилища источника, так что вы бы в конечном итоге с:

<register type="IRepository[Source]" mapTo="SourceRepository"> 
    <lifetime type="transient" /> 
    <constructor> 
     <param name="context"> 
      <dependency name="EntityContext"/> 
     </param> 
    </constructor> 
</register> 
+0

спасибо, ты спас меня часы :) .. Я удалил имя, и оно работает. – zosim

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