.Net Unity 对象实例问题
我真的一直在努力让 Unity 为我正在从事的 ac# 项目工作。
它在我的统一控制器工厂类中抛出“对象引用未设置到对象实例”错误。
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:
它发生在以下行:
return (IController)_container.Resolve(controllerType);
在UnityControllerFactory.cs中
I really stuck trying to get unity to work for a c# project I'm working on.
Its throwing an "Object reference not set to an instance of an object" error in my unity controller factory class.
UnityControllerFactory.cs file:
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);
}
}
}
My Global.asax.cs file is:
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);
}
And my Web.config is:
<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>
......
I have added project references to Microsoft.Practices.unity and
Microsoft.Practices.Unity.Configuration, version 1.1.0.0.
My runtime version under those references properties says v2.0.50727
Could this be the issue? I do have two versions availble when I go to add the references?
Adding error details here (I cant attach images!):
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:
It occurs at line:
return (IController)_container.Resolve(controllerType);
in UnityControllerFactory.cs
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它似乎是在
Microsoft.Practices.Unity.UnityContainer.DoBuildUp
引起的。我大胆猜测它可能是您类型之一的构造函数中的某些内容?It seems to be causing it at
Microsoft.Practices.Unity.UnityContainer.DoBuildUp
. I would hazard a guess that it could be something in the constructor of one of your types?您偶然发现了 Unity 中的一个错误,这是肯定的。可重用框架永远不应该抛出
NullReferenceException
。您可能配置错误,但是通过查看异常无法判断原因是什么。当我使用 Reflector 查看 Unity v2.0 的
ResolutionFailedException.CreateMessage
方法时,我找不到任何可能引发NullReferenceException
的地方。因此,您必须使用旧版本,我猜他们修复了从未版本中的错误。尝试使用 v2.0。我敢打赌,在这种情况下你会得到更好的异常消息。You stumbled upon a bug in Unity, that's for sure. A reusable framework should never throw a
NullReferenceException
. You probably misconfigured it, but it is impossible to tell what the cause of this is by looking at the exception.When I look at the
ResolutionFailedException.CreateMessage
method of Unity v2.0 using Reflector, I can't find any spot that could throw anNullReferenceException
. Therefore you must be using an older version and I guess they fixed the error in a never version. Try using v2.0. I bet you get a better exception message in that case.我开始认为这是 dll 安装/配置问题。这是一个团队项目,在其他机器上运行良好。我已删除我的项目并重新将干净版本签入我的计算机。
当 VisualStudio 文件遇到“return (IController)_container.Resolve(controllerType);”行错误时,我不断收到 VisualStudio 文件弹出对话框在工厂类中。
文件弹出窗口要求查找源文件:到目前为止,要求的文件有:
e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainerExtensions.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\Utility\Guard.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity.Configuration\UnityTypeResolver.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\ResolutionFailedException.cs"
我注意到在“C:\Program Files\”下我同时拥有 Microsoft Unity Application Block 1.1 和 Microsoft Unity Application Block 2.0 文件夹。
另外,我使用的是 Vista 操作系统......也许这有什么奇怪的?
I'm starting to think this is a dll instalation/config problem. It's a team project and works fine on others machines. I have deleted my projects and re-checked in a clean version into my machine.
I keep getting VisualStudio File pop-up dialog boxes when its hits the error on line 'return (IController)_container.Resolve(controllerType);' in the factory class.
The File pop up is asking to find source files: So far files asked for are:
e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainerExtensions.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\Utility\Guard.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity.Configuration\UnityTypeResolver.cs
e:\Builds\Unity\UnityTemp\Compile\Unity\Src\Unity\ResolutionFailedException.cs"
I noticed that under 'C:\Program Files\' I have both Microsoft Unity Application Block 1.1 and Microsoft Unity Application Block 2.0 folders.
Also, I'm on Vista OS....maybe something quirky with this?