Проблемы экземпляра .Net Unity Object - PullRequest
0 голосов
/ 03 декабря 2010

Я действительно застрял, пытаясь добиться единства для проекта c #, над которым я работаю.

В моем классе фабрики контроллеров единиц измерения выдается ошибка «Ссылка на объект не установлена ​​на экземпляр объекта».

Файл 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

Ответы [ 3 ]

0 голосов
/ 03 декабря 2010

Кажется, это вызывает Microsoft.Practices.Unity.UnityContainer.DoBuildUp.Я бы рискнул предположить, что это может быть что-то в конструкторе одного из ваших типов?

0 голосов
/ 04 декабря 2010

Я начинаю думать, что это проблема установки / конфигурации DLL. Это командный проект и отлично работает на других машинах. Я удалил свои проекты и повторно проверил чистую версию на своем компьютере.

Я продолжаю получать всплывающие диалоговые окна «Файл VisualStudio», когда в нем возникает ошибка в строке «return (IController) _container.Resolve (controllerType);» в заводском классе.

Всплывающее окно «Файл» просит найти исходные файлы. Пока что запрашиваются следующие файлы: е: \ Строит \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ UnityContainerExtensions.cs е: \ Строит \ Unity \ UnityTemp \ Compile \ Unity \ Unity \ Src \ Utility \ Guard.cs е: \ Строит \ Unity \ UnityTemp \ Compile \ Unity \ Src \ Unity.Configuration \ UnityTypeResolver.cs е: \ Строит \ Unity \ UnityTemp \ Compile \ Unity \ Src \ Unity \ ResolutionFailedException.cs "

Я заметил, что в папке 'C: \ Program Files \' у меня есть папки Microsoft Unity Application Block 1.1 и Microsoft Unity Application Block 2.0.

Кроме того, я на Vista OS .... может быть, что-то странное с этим?

0 голосов
/ 03 декабря 2010

Вы наткнулись на ошибку в Unity, это точно. Многоразовые рамки никогда не должны выбрасывать NullReferenceException. Возможно, вы неправильно настроили его, но невозможно определить причину этого, посмотрев на исключение.

Когда я смотрю на ResolutionFailedException.CreateMessage метод Unity v2.0 с использованием Reflector, я не могу найти ни одного места, которое могло бы выбросить NullReferenceException. Поэтому вы должны использовать более старую версию, и я думаю, что они исправили ошибку в никогда не версии. Попробуйте использовать v2.0. Могу поспорить, что в этом случае вы получите лучшее сообщение об исключении.

...