StructureMap异常代码:202没有为PluginFamily定义的默认实例

时间:2010-05-26 06:19:11

标签: c# asp.net structuremap

我是StructureMap的新手。我已经下载了 使用版本2.6.1.0。我一直在下面 错误:

  

StructureMap异常代码:202 No.   为。定义的默认实例   PluginFamily   Company.ProjectCore.Core.IConfiguration,   Company.ProjectCore,Version = 1.0.0.0,   Culture = neutral,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更改为“new Container”进行调试。 当单步执行AssertConfigurationIsValid()方法时,缓存 但是,EmailService在GetInstance方法中失败了 以下一行:

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

private readonly IConfiguration _configuration;

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

如果删除IEmailService,IUserSession会抛出相同的202错误。

我应该在Application_Start或我的类文件中添加其他内容吗?

提前致谢...

8 个答案:

答案 0 :(得分:21)

通过将ObjectFactory.Initialize替换为ObjectFactory.Configure并在项目中添加程序集来解决此问题:

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

答案 1 :(得分:12)

我收到了相同的错误消息,但原因不同。我有一个类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没有为Bar定义默认实例

问题是StructureMap试图使用带参数的构造函数构造一个Foo,而不是使用无参数的默认构造函数。我使用How to define a default constructor by code using StructureMap?中的答案解决了它,如此:

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

答案 2 :(得分:5)

IConfiguration具体类的引导位置在哪里?

即:

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

答案 3 :(得分:2)

我看到同样的错误。在我的例子中,我在实现名称中输入了一个拼写错误,因此接口和实现名称不匹配。

public class FooTypo : IFoo

我应该拥有的地方:

public class Foo : IFoo

答案 4 :(得分:2)

要寻找的另一件事是确保您注入的依赖项(类)是 public 。如果该类是内部的,则可能导致此问题。

答案 5 :(得分:1)

我的原因是我不小心在另一个类的构造函数中而不是在接口中引用了具体类型

例如在我拥有的结构图中

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) {...}
}

这也意味着我的异常引用了具体的类型而不是接口,但是我一开始错过了它

答案 6 :(得分:0)

当我收到此错误时,是因为我忘了标记我的班级public。那很简单。

答案 7 :(得分:0)

当我使用带有NCrunch的Visual Studio 2015时,我也遇到了这个问题。 您所要做的就是在NCrunch下的配置菜单项中将选项切换为 true 。切换初始化配置对我来说没有用。

该选项位于“构建设置”下,其名称为“将引用的程序集复制到工作区&#39;