【问题标题】:Unity (in PRISM) does (not) weird resolving...??!!Unity(在 PRISM 中)确实(不)奇怪地解决了......??!!
【发布时间】:2010-12-23 02:07:37
【问题描述】:

我正在使用 PRISM,并且在 Bootstrapper 类中我确实覆盖了 ConfigureContainer() 方法。只是这几行没有什么花哨的:

protected override void ConfigureContainer()
{       
    Container.RegisterType<IDataContext, SQLDataContext>(new InjectionConstructor(@"Server=localhost\SQLExpress;User Id=sa;Password=xxxxx;Database=MyDatabase"));
        base.ConfigureContainer();
}

在“调试时间”我尝试调用 Container.Resolve() 但这给了我以下错误:

{"解析依赖失败,type = \"Photo.DAL.Abstract.IDataContext\", name = \"\"。异常信息为:当前构建操作(构建键Build Key[Photo.DAL. Concrete.SQLDataContext, null]) 失败:值不能为 null。\r\n参数名称:流(策略类型 BuildPlanStrategy,索引 3)"} System.Exception {Microsoft.Practices.Unity.ResolutionFailedException}

但是当我这样做时

Container.IsTypeRegistered(typeof(IDataContext))

我是真的!!!

  • 我错过了什么???

作为答案发布的信息如下,应该是对问题的编辑:

这是完整的堆栈:

Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Photo.DAL.Abstract.IDataContext", name = "". Exception message is: The current build operation (build key Build Key[Photo.DAL.Concrete.SQLDataContext, null]) failed: Value cannot be null.
Parameter name: stream (Strategy type BuildPlanStrategy, index 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: The current build operation (build key Build Key[Photo.DAL.Concrete.SQLDataContext, null]) failed: Value cannot be null.
Parameter name: stream (Strategy type BuildPlanStrategy, index 3) ---> System.ArgumentNullException: Value cannot be null.
Parameter name: stream
   at System.Data.Linq.Mapping.XmlMappingSource.FromStream(Stream stream)
   at Photo.DAL.Mapping.GetMapping() in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.DAL\Mapping.cs:line 18
   at Photo.DAL.Concrete.SQLDataContext..ctor(String connectionString) in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.DAL\Concrete\SQLDataContext.cs:line 52
   at BuildUp_Photo.DAL.Concrete.SQLDataContext(IBuilderContext )
   at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
   --- End of inner exception stack trace ---
   at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
   at Microsoft.Practices.ObjectBuilder2.Builder.BuildUp(IReadWriteLocator locator, ILifetimeContainer lifetime, IPolicyList policies, IStrategyChain strategies, Object buildKey, Object existing)
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   --- End of inner exception stack trace ---
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name)
   at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve(Type t)
   at Microsoft.Practices.Unity.UnityContainerBase.Resolve[T]()
   at Photo.Desktop.Bootstrapper.ConfigureContainer() in C:\Users\Savvas\Documents\Visual Studio 2008\Projects\Photo\Photo.Desktop\Bootstrapper.cs:line 42

我注意到错误不是来自实际解析类,而是来自定义为的调用方法 GetMapping()

public static class Mapping
    {
        public static XmlMappingSource GetMapping()
        {
            XmlMappingSource mapping;
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Photo.DAL.Entities.Entities.map"))
            {
                mapping = XmlMappingSource.FromStream(stream);
            }
            return mapping;
        }
    }
  • Unity 无法做到这一点吗? (它与温莎合作得很好!!)

【问题讨论】:

  • :( 对于极其混乱的标题!
  • 是的,你是对的......但我也很困惑! :))

标签: unity-container prism ioc-container


【解决方案1】:

这可能是两件事之一......从你的异常中不清楚......

  1. 可能还有另一个内部 可能被屏蔽的异常?

  2. 否则 可能 SqlDataContext 类有一个 接受流的构造函数?

同样,例外情况还不够清楚(至少对我而言)。如果这些建议都没有帮助,您能否在您的问题中发布 $exception.ToString() 的完整输出?

编辑:根据您的完整堆栈跟踪,失败的代码行是这一行:

using (Stream stream = Assembly.
                       GetExecutingAssembly().
                       GetManifestResourceStream("Photo.DAL.Entities.Entities.map"))
{
    //This line is failing with null argument
    mapping = XmlMappingSource.FromStream(stream);
}

您的资源流返回 null,这表明您的资源不存在或无法加载程序集(有时这指的是附属程序集)。我会首先怀疑前者...检查以确保您的 .map 文件上的 Build 设置正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2013-12-29
    • 2012-03-03
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多