Подтвердить что ты не робот

Код исключения StructureMap: 202 Нет значения по умолчанию для модуля PluginFamily

Я новичок в StructureMap. Я скачал и используя версию 2.6.1.0. Я продолжаю получать ниже Ошибка:

Код исключения StructureMap: 202 Нет Экземпляр по умолчанию, определенный для PluginFamily Company.ProjectCore.Core.IConfiguration, Company.ProjectCore, Version = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null

My Global.asax.cs выглядит так:

protected void Application_Start(object sender, EventArgs e)
{

    var container = new Container(x =>
                    {
                        x.For<ICache>().Use<Cache>();
                        x.For<IEmailService>().Use<EmailService>();
                        x.For<IUserSession>().Use<UserSession>();
                        x.For<IRedirector>().Use<Redirector>();
                        x.For<INavigation>().Use<Navigation>();
                    });

                container.AssertConfigurationIsValid();

}

Я изменил с ObjectFactory.Initialize на "новый контейнер" для отладки. При переходе через метод AssertConfigurationIsValid() кеш работает, но EmailService не работает с методом GetInstance в следующая строка:

[Pluggable("Default")]
public class EmailService : IEmailService

private readonly IConfiguration _configuration;

public EmailService()
{
    _configuration = ObjectFactory.GetInstance<IConfiguration>();
}

Если я удалю IEmailService, в IUserSession будет сброшена ошибка 202.

Должен ли я добавлять что-то еще в Application_Start или в мои файлы классов?

Спасибо заранее...

4b9b3361

Ответ 1

Эта проблема была устранена заменой ObjectFactory.Initialize на ObjectFactory.Configure и добавлением сборок в мой проект:

ObjectFactory.Configure(x =>
{
    x.Scan(scan =>
    {
        scan.LookForRegistries();
        scan.Assembly("MyAssembly");
        scan.Assembly("MyAssembly");
    });
});

Ответ 2

Я получал то же сообщение об ошибке, но по другой причине. У меня был класс Foo, который определил два таких конструктора:

public class Foo : IFoo
{
    private Bar _bar;

    public Foo()
    {
       _bar = new Bar();
    }

    public Foo(Bar bar)
    {
        _bar = bar;
    }
}

и моя конфигурация StructureMap была такой:

For<IFoo>.Use<Foo>();

Я продолжал получать сообщение об ошибке, например

202 Нет значения по умолчанию для бара

Проблема заключалась в том, что StructureMap пытался построить Foo, используя конструктор, который принимает параметр, вместо использования конструктора по умолчанию без параметров. Я решил это, используя ответ в Как определить конструктор по умолчанию с помощью метода StructureMap? так:

For<IFoo>.Use(() => new Foo());

Ответ 3

Где вы загрузите конкретный класс IConfiguration?

то есть:

x.For<IConfiguration>().Use<Configuration>();

Ответ 4

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

public class FooTypo : IFoo

Где я должен был:

public class Foo : IFoo

Ответ 5

Еще одна вещь, которую нужно искать, - убедиться, что зависимость (класс), которую вы вводите, общедоступна. Если класс является внутренним, это может вызвать эту проблему.

Ответ 6

Когда я получил эту ошибку, это произошло потому, что я забыл отметить мой класс public. Это просто.

Ответ 7

У меня также была эта проблема, когда я использовал Visual Studio 2015 с NCrunch. Все, что вам нужно сделать, это переключить параметр true в пункт меню конфигурации в разделе "NCrunch". Переключение инициализации на конфигурацию не помогло мне.

Параметр находится в разделе "Настройки сборки", он называется "Копировать ссылочные сборки в рабочее пространство"