.Net 4.0中的奇怪StructureMap行为

时间:2010-09-13 13:26:12

标签: structuremap

我有一段代码可以用四种方式运行

  1. 调试构建 - 在调试器中 - 工作得很好

  2. 调试构建 - 外部调试器 - 失败

  3. 发布版本 - 在调试器中 - 失败

  4. 发布版本 - 外部调试器 - 失败。

  5. 在所有情况下给出的错误代码是202 - 与无参数构造函数有关,底部是调用堆栈。

    在每种情况下,当它构建要求的第一个对象时,它在同一点失败。

    我无法使用调试来构建源代码,因为我使用的是.Net 4.0,并且似乎没有安装.Net 2.0 SDK来构建它。

    我开始没有想法......

    例外:

    Test method DataLoaders.Integration.ContactMappingTests.EntityContactMappingTest threw exception: 
    StructureMap.StructureMapException: StructureMap Exception Code:  202
    No Default Instance defined for PluginFamily System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
    

    调用堆栈:

    StructureMap.BuildSession.<.ctor>b__0(Type t)
    StructureMap.Util.Cache`2.get_Item(KEY key)
    StructureMap.BuildSession.CreateInstance(Type pluginType)
    StructureMap.Pipeline.DefaultInstance.build(Type pluginType, BuildSession session)
    StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
    StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
    StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)
    StructureMap.Pipeline.Arguments.Get[T](String propertyName)
    lambda_method(Closure , IArguments )
    StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.<CreateBuilder>b__0(IArguments args)
    StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)
    StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)
    StructureMap.Pipeline.ConstructorInstance.build(Type pluginType, BuildSession session)
    StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)
    StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
    StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
    StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)
    StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)
    StructureMap.BuildSession.<>c__DisplayClass3.<.ctor>b__1()
    StructureMap.BuildSession.CreateInstance(Type pluginType)
    StructureMap.Container.GetInstance[T]()
    StructureMap.ObjectFactory.GetInstance[PLUGINTYPE]()
    DataLoaders.Processor.ProcessData(DataConfig config) in D:\TFS\Main\Source\DataLoaders\DataLoaders\Processor.cs: line 20
    

2 个答案:

答案 0 :(得分:3)

我无法解释为什么它适用于一个案例而不是其他案例。

但是,我将从查看System.Uri类开始。 4.0在类中添加了构造函数,这绝对会改变容器解析的方式。我相信StructureMap总是会尝试默认使用最贪婪的构造函数。

自从这篇文章以来,API可能已经发生了变化,但这至少可以让你开始: http://codebetter.com/blogs/jeremy.miller/archive/2009/01/07/choosing-the-constructor-function-in-structuremap-without-attributes.aspx

答案 1 :(得分:0)

在痛苦的追踪和错误之后,我可以重现错误,并且发生这种情况的原因是因为 在结构地图容器的单个实例 中多次注册IRestClient。

  

注意:只应注册一次IRestClient。

我通过删除所有重复注册并将其添加到负责引导应用程序的父应用程序来实现此目的!

这不是一个理想的情况,但我想我们仍然坚持使用Restsharp v105.2.3.0和StructureMap v2.6.4.0