2013-05-25 5 views
1

Я использую шаблон GenericRepository от https://github.com/huyrua/efprs. Я просто хочу выбрать конструктор с параметром DbContext. Я знаю, что есть дублированный вопрос, но решение от this не решило. Вот моя конфигурация:StructureMap выбрать несколько конструкторов на GenericRepository

ObjectFactory.Initialize(x => 
{ 
    x.Scan(scan => 
    { 
     scan.TheCallingAssembly(); 
     scan.AssemblyContainingType<Data.Entity.TokoContainer>(); 
     scan.WithDefaultConventions(); 
    }); 
    x.For<DbContext>().Use<Data.Entity.TokoContainer>(); 
    x.For<Infrastructure.Data.IRepository>() 
    .Use<Infrastructure.Data.GenericRepository>() 
    .Ctor<DbContext>().Is(c => c.GetInstance<DbContext>()); 
}); 

эта причина ошибка «StructureMap Код исключения: Там не аргумент типа System.Data.Entity.DbContext для конкретного типа Infrastructure.Data.GenericRepository».

При использовании этого:

x.SelectConstructor<Infrastructure.Data.IRepository>(() => new Infrastructure.Data.GenericRepository((DbContext)null)); 
x.ForConcreteType<Infrastructure.Data.IRepository>() 
.Configure.Ctor<DbContext>().Is(c => c.GetInstance<DbContext>()); 

Причинение "сбои конфигурации StructureMap: Ошибка 104".

Указание от первого кода, добавив имя параметра "контекст", как это:

x.For<Infrastructure.Data.IRepository>() 
.Use<Infrastructure.Data.GenericRepository>() 
.Ctor<DbContext>("context").Is(c => c.GetInstance<DbContext>()); 

вызывает ошибку "Missing просил Instance свойство "connectionStringName" для InstanceKey ххх". Я не знаю, что делать сейчас.

Любое решение будет оценено по достоинству.

+0

«Там не аргумент типа System.Data.Entity.DbContext для конкретного типа Infrastructure.Data.GenericRepository». Это потому, что «GenericRepository» зависит от «ObjectContext». Не 'DbContext'. – Steven

+0

Я использую ту же самую библиотеку и имею такое же исключение. неудивительно – Deeptechtons

ответ

0

StructureMap пытается выразить, что DbContext имеет конструктор с параметром строки «connectionStringName». Как вы можете видеть в тестовом сценарии ссылке вы приложили: MyDbContext.cs

public class MyDbContext : DbContext 
{ 
    ...  
    public MyDbContext(string connStringName) : 
     base(connStringName) 
    { 
    ... 

Итак, что нам нужно сделать, это правильно отобразить конструктор DbContext. Например:

x.For<DbContext>() 
.Use<Data.Entity.TokoContainer>() 
// example, taking the first conn string - adjust as needed 
.Ctor<string>().Is(ConfigurationManager.ConnectionStrings[0].ConnectionString); 
; 

Теперь даже DbContext будет правильно установлен

+0

Ошибка: Код исключения StructureMap: 302. Нет аргументов типа System.String для конкретного типа Toko.Data.Entity.TokoContainer – iroel

+0

Если TokoContainer - ваш класс, измените его конструктор. Вы должны передавать строку conn в базовый DBContext в любом случае –

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