StructureMap Exception Code: 202 No Default Instance defined for PluginFamily

浪子不回头ぞ 提交于 2019-11-28 06:58:14

问题


I am new to StructureMap. I have downloaded and am using version 2.6.1.0. I keep getting the below error:

StructureMap Exception Code: 202 No Default Instance defined for PluginFamily Company.ProjectCore.Core.IConfiguration, Company.ProjectCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

My Global.asax.cs looks like:

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();

}

I changed from ObjectFactory.Initialize to "new Container" to debug. When stepping through the AssertConfigurationIsValid() method, Cache works but EmailService fails at the GetInstance method in the following line:

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

private readonly IConfiguration _configuration;

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

If I remove IEmailService, the same 202 error is thrown at IUserSession.

Should I be adding something else in Application_Start or in my class files?

Thanks in advance...


回答1:


This problem was fixed by replacing ObjectFactory.Initialize with ObjectFactory.Configure and adding the assemblies in my project:

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



回答2:


I was getting the same error message, but for a different reason. I had a class Foo that defined two constructors like so:

public class Foo : IFoo
{
    private Bar _bar;

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

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

and my StructureMap configuration was like so:

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

I kept getting an error message like

202 No Default Instance defined for Bar

The problem was that StructureMap was trying to construct a Foo using the constructor that takes a parameter, instead of using the parameterless default constructor. I solved it using the answer in How to define a default constructor by code using StructureMap? like so:

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



回答3:


Where's your bootstrapping for the IConfiguration concrete class?

I.e:

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



回答4:


I was seeing the same error. In my case, I had a typo in the implementation name, so the interface and implementation names did not match.

public class FooTypo : IFoo

Where I should have had:

public class Foo : IFoo



回答5:


Another thing to look for is to make sure that the dependency (class) that you are injecting is public. If the class is internal, it can cause this issue.




回答6:


When I got this error it was because I forgot to mark my class public. That simple.




回答7:


I also had this issue when I was using Visual Studio 2015 with NCrunch. All you have to do is toggle an option to true in the configuration menu item under NCrunch. Switching initialize to configure didn't work for me.

The option is under Build Settings, it is named 'Copy referenced assemblies to workspace'



来源:https://stackoverflow.com/questions/2910493/structuremap-exception-code-202-no-default-instance-defined-for-pluginfamily

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!