0

我真的坚持尝试让我工作的c#项目的团结工作。.Net Unity对象实例问题

它在我的统一控制器工厂类中抛出“未设置为对象实例的对象引用”错误。

UnityControllerFactory.cs文件:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.Configuration; 

namespace Sportrax.Presentation.Admin 
{ 
    public class UnityControllerFactory : DefaultControllerFactory 
    { 
     IUnityContainer _container; 

     public UnityControllerFactory(IUnityContainer container) 
     { 
      _container = container; 
     } 

     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      return (IController)_container.Resolve(controllerType); 
     } 

    } 
} 

我的Global.asax.cs文件是:

protected void Application_Start() 
     { 
      IUnityContainer container = new UnityContainer(); 
      UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 

      section.Containers.Default.Configure(container); 

      UnityControllerFactory factory = new UnityControllerFactory(container); 
      ControllerBuilder.Current.SetControllerFactory(factory); 

      AreaRegistration.RegisterAllAreas(); 
      RegisterRoutes(RouteTable.Routes); 
     } 

而且我的web.config是:

<configuration> 
    <configSections> 
     <section name ="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> 
    </configSections> 
    <unity> 
     <containers> 
      <container> 
       <types> 
        <type type="Sportrax.Business.Interfaces.IVenueService, Sportrax.Business" mapTo="Sportrax.Business.VenueService, Sportrax.Business" /> 
        <type type="Sportrax.DAL.Interfaces.IVenueRepository, Sportrax.DAL" mapTo="Sportrax.DAL.Repositories.VenueRepository, Sportrax.DAL" /> 
       </types> 
      </container> 
     </containers> 
    </unity> 
    ...... 

我已经加入项目参考Microsoft.Practices.unity和 Microsoft.Practices.Unity.Configuration,版本1.1 .0.0。根据这些文献性质

我运行时版本说V2.0.50727

难道这是问题?当我添加引用时,我确实有两个版本可用。

添加错误的详细信息在这里(我不能附上图片!):

System.NullReferenceException was unhandled by user code 
    Message=Object reference not set to an instance of an object. 
    Source=Microsoft.Practices.Unity 
    StackTrace: 
     at Microsoft.Practices.Unity.ResolutionFailedException.CreateMessage(Type typeRequested, String nameRequested, Exception innerException) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\ResolutionFailedException.cs:line 99 
     at Microsoft.Practices.Unity.ResolutionFailedException..ctor(Type typeRequested, String nameRequested, Exception innerException) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\ResolutionFailedException.cs:line 43 
     at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:line 467 
     at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:line 450 
     at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainer.cs:line 149 
     at Microsoft.Practices.Unity.UnityContainerBase.Resolve(Type t) in e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\UnityContainerBase.cs:line 416 
     at Sportrax.Presentation.Admin.UnityControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) in C:\Users\Thomas\Documents\College\MSc Web Technologies\Project .Net\Sportrax\Sportrax.Solution\Sportrax.Presentation.Admin\UnityControllerFactory.cs:line 23 
     at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
     at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
     at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
     at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
     at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
     at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
     at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
    InnerException: 

它发生在行:

回报(一个IController)_container.Resolve(controllerType);

在UnityControllerFactory.cs

+0

这个东西已经变得不可能遵循了,SO不是一个论坛,答案会在页面上向上或向下移动,所以说“看到页面结尾”不起作用。如果你仍然没有得到答案,你能编辑你的原始问题以包括你的现状吗? – 2010-12-09 21:31:45

+0

同意的克里斯,它到处都是......抱歉,只有新来的,并不是100%确定如何发布工作,认为我现在会关闭问题把我的东西存入存储库,并在别人的结帐副本上统一测试。由于项目不久就要交付,不能再浪费时间来解决这个问题了。如果我有时间查看并在稍后的日期修复,我会更新答案。 – 2010-12-12 03:45:18

回答

0

我开始认为这是一个DLL instalation/config问题。这是一个团队项目,可以在其他机器上正常工作。我删除了我的项目,并将干净的版本重新签入我的机器。

当它在命令行中返回时出现VisualStudio File弹出对话框'return(IController)_container.Resolve(controllerType);'在工厂班。

文件弹出被要求找到源文件:要求到目前为止文件是: E:\构建\团结\ UnityTemp \编译\团结\统一的\ src \ UnityContainerExtensions.cs E:\构建\团结\ Unity \ Temp \ Compile \ Unity \ Unity \ Src \ Utility \ Guard.cs e:\ Build \ Unity \ UnityTemp \ Compile \统一的\ src \团结\ ResolutionFailedException。CS”

我注意到,在 'C:\ Program Files文件\' 我有Microsoft统一应用程序块1.1和Microsoft统一应用程序块2.0文件夹

而且,我对Vista操作系统......。也许这是一个古怪的东西呢?

0

你偶然发现了一个团结的错误,这是肯定的。一个可重用的框架永远不应该抛出一个NullReferenceException。您可能对其进行了错误配置,但通过查看异常无法确定其原因。

当我使用Reflector查看Unity v2.0的ResolutionFailedException.CreateMessage方法时,我找不到任何可能会抛出NullReferenceException的点。因此,你必须使用旧版本,我想他们在一个从未版本中修正了错误。尝试使用v2.0。我敢打赌你会在这种情况下得到一个更好的异常消息。

0

它似乎是造成它在Microsoft.Practices.Unity.UnityContainer.DoBuildUp。我会冒险猜测它可能是你的类型的构造函数中的东西?