Код исключения StructureMap: 202 Нет экземпляра по умолчанию, определенного для PluginFamily - PullRequest
21 голосов
/ 26 мая 2010

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

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

Мой 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, в IUserSession выдается та же ошибка 202.

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

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

Ответы [ 7 ]

21 голосов
/ 26 мая 2010

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

ObjectFactory.Configure(x =>
{
    x.Scan(scan =>
    {
        scan.LookForRegistries();
        scan.Assembly("MyAssembly");
        scan.Assembly("MyAssembly");
    });
});
12 голосов
/ 26 июля 2012

Я получаю то же сообщение об ошибке, но по другой причине. У меня был класс 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());
5 голосов
/ 26 мая 2010

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

т.е:

x.For<IConfiguration>().Use<Configuration>();
2 голосов
/ 23 ноября 2016

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

2 голосов
/ 05 августа 2014

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

public class FooTypo : IFoo

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

public class Foo : IFoo
0 голосов
/ 05 января 2016

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

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

0 голосов
/ 26 февраля 2015

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

...