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

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

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

Мой 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 () Cache работает, но EmailService дает сбой в методе GetInstance в следующей строке:

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

private readonly IConfiguration _configuration;

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

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

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

Заранее спасибо...


person Peter    schedule 26.05.2010    source источник
comment
К какому прикладному уровню принадлежит StructureMap? Пользовательский интерфейс, бизнес или уровень данных?   -  person Rod    schedule 18.04.2016


Ответы (8)


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

ObjectFactory.Configure(x =>
{
    x.Scan(scan =>
    {
        scan.LookForRegistries();
        scan.Assembly("MyAssembly");
        scan.Assembly("MyAssembly");
    });
});
person Peter    schedule 26.05.2010
comment
Спасибо за это. Работает хорошо. Вы можете отметить это как ответ, пожалуйста. Потому что это легко для читателя. - person Saghar; 18.04.2011
comment
У меня было такое же сообщение об ошибке. Причина моей проблемы заключалась в том, что StructureMap не смог найти реализацию интерфейса из-за соглашения ISomething / Something по умолчанию (см. structuremap.github.io/registration/). Как только я изменил имя внедрения, чтобы оно соответствовало имени интерфейса, все заработало. - person tlinqu; 31.07.2019

Я получал то же сообщение об ошибке, но по другой причине. У меня был класс 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());
person Community    schedule 25.07.2012

Где ваша начальная загрузка для конкретного класса IConfiguration?

I.e:

x.For<IConfiguration>().Use<Configuration>();
person RPM1984    schedule 26.05.2010
comment
Да .. Я пытался добавить это, но, похоже, это не имеет значения. Когда он есть, в него никогда не попадают. Когда я закомментировал все другие классы, компилятор действует так, как будто его нет, и просто переходит к следующему блоку кода. Кроме того, как я указывал ранее, если я извлекаю IEmailService (где вызывается IConfiguration), вызывается следующий интерфейс - IUserSession, и я снова получаю ошибку 202. Итак, я не думаю, что ответ на мою проблему заключается в том, как я загружаю IConfiguration. - person Peter; 26.05.2010
comment
Ответ на вашу проблему, безусловно, заключается в том, как вы выполняете самозагрузку. Ошибка StructureMap 202 означает, что вы не сказали StructureMap, как разрешить зависимость (при начальной загрузке). В этом конкретном случае вы никогда не говорили, как разрешить IConfiguration. - person Joshua Flanagan; 27.05.2010

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

public class FooTypo : IFoo

Где у меня должно было быть:

public class Foo : IFoo
person Francisco d'Anconia    schedule 04.08.2014

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

person chandler    schedule 22.11.2016
comment
Конструктор моего класса был «защищен», изменение на public помогло. - person Dribbel; 13.08.2018

Мой был потому, что я случайно указал на конкретный тип в конструкторе другого класса, а не на интерфейс.

например, в структурной карте у меня было

x.For<IFoo>().Use<Foo>();
x.For<IBar>().Use<Bar>();

а конструктор для Foo выглядел так

public class Foo : IFoo {
    public Foo(Bar bar) {...}
}

когда это должно было выглядеть так, поскольку SM не может просто создать экземпляр Bar, он знает только, как создать IBar:

public class Foo : IFoo {
    public Foo(IBar bar) {...}
}

Это также означало, что мое исключение ссылалось на конкретный тип вместо интерфейса, но я пропустил это изначально.

person James Carter    schedule 01.01.2020

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

person ErikE    schedule 26.02.2015

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

Этот параметр находится в разделе «Параметры сборки» и называется «Копировать сборки, на которые имеются ссылки, в рабочую область».

person Vishav Premlall    schedule 05.01.2016