2015-03-22 2 views
1

Я строю и ASP.NET MVC 4.5. Я добавил StructureMap в свой проект. Я создал в своем веб-сайте и IoC класса:StructureMapConfigurationException

public static IContainer Initialize() 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings["Ebancomat"].ConnectionString; 

     ObjectFactory.Initialize(x => 
     { 
      x.For<Ebancomat.DataAdapters.IncomeExpenses.IIncomeExpensesDataAdapter>().Use<Ebancomat.DataAdapters.IncomeExpenses.IncomeExpensesDataAdapter>().Ctor<string>("connectionString").Is(connectionString); 
      x.For<Ebancomat.Repositories.IncomeExpenses.IIncomeExpensesRepository>().Use<Ebancomat.Repositories.IncomeExpenses.IncomeExpensesRepository>(); 
     }); 

     return ObjectFactory.Container; 
    } 

и StructureMapControllerFactory класса:

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    private readonly IContainer container; 

    public StructureMapControllerFactory(IContainer container) 
    { 
     this.container = container; 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     var instance = container.GetInstance(controllerType) as IController; 

     if (instance == null) 
     { 
      return base.GetControllerInstance(requestContext, controllerType); 
     } 

     return instance; 
    } 
} 

Я добавил это ISN мои Global.asax.cs:

var container = Ioc.Initialize(); 
     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory(container)); 

Когда я впервые запустил приложение, открылось окно, и ему понадобилось Container.cs. Я не нашел этот класс, я нажал Cancel, и с тех пор я получаю эту ошибку, и я не понимаю, почему. (Я попробовал один и тот же код на работе, и там работает отлично)

An exception of type 'StructureMap.StructureMapConfigurationException' occurred in StructureMap.dll but was not handled in user code 
Additional information: No default Instance is registered and cannot be automatically determined for type 'IUserStore<ApplicationUser>' 

ответ

1

Он просит Container.cs, потому что это класс в StructureMap, который бросает исключение; поскольку вы (я полагаю) ссылаюсь на двоичный файл StructureMap.DLL, у вас не будет источника. Я бы не стал беспокоиться об этом.

Похоже, вы звоните ObjectFactory.GetInstance по типу, который вы еще не зарегистрировали.

ObjectFactory.Initialize ваших регистров конкретных типов для IIncomeExpensesDataAdapter и IIncomeExpensesRepository, но я не вижу ничего для IUserStore<ApplicationUser> или IUserStore<T>

Вы можете найти код для ObjectFactory.GetInstance и проверить, есть ли где-нибудь вы используете это без регистрации объекта Граф в StructureMap?

+0

я искал. Нет, нет. –

1

Я предполагаю, что IUserStore<ApplicationUser> решается с помощью впрыска конструктора, и SM can not разрешает его, потому что он не зарегистрирован в контейнере. Так что вам нужно только зарегистрировать IUserStore<ApplicationUser> в контейнере.

Я также хотел бы избавиться от ObjectFactory в пользу new Container

public static IContainer Initialize() 
{ 
    var connectionString = ConfigurationManager.ConnectionStrings["Ebancomat"].ConnectionString; 

    return new Container(
     c => 
      { 
       c.For<Ebancomat.DataAdapters.IncomeExpenses.IIncomeExpensesDataAdapter>() 
        .Use<Ebancomat.DataAdapters.IncomeExpenses.IncomeExpensesDataAdapter>() 
        .Ctor<string>("connectionString") 
        .Is(connectionString); 
       c.For<Ebancomat.Repositories.IncomeExpenses.IIncomeExpensesRepository>() 
        .Use<Ebancomat.Repositories.IncomeExpenses.IncomeExpensesRepository>(); 
       c.For<IUserStore<ApplicationUser>>().Use<DatabaseUserStore>(); 
     }); 
} 
+0

Я пробовал свой путь, но у меня другая проблема; Я не знаю, где найти «DatabaseUserStore», чтобы добавить использование. –

+0

@MarianEne этот тип подделка. Я использовал для этого фрагмента кода. Вы должны использовать тот, который используете. – LetMeCodeThis