本文介绍了NuGet的Unity Bootstrapper在App_Start上引发错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

用于Unity 3.0的Microsoft Unity Bootstrapper在此行上引发错误:

the Microsoft Unity Bootstrapper for Unity 3.0 is throwing an error on this line:

FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

,出现以下错误:

其他信息:尝试以类型访问元素 与数组不兼容.

Additional information: Attempted to access an element as a type incompatible with the array.

全部代码都在这里,并且都是由从nuget下载的引导程序预先编写和编写的.

The entirety of the code is here and this was all pre-made and written by the bootstrapper downloaded from nuget.

引导程序生成的文件App_Start/UnityMVCActivator.cs

using System.Linq;
using System.Web.Mvc;
using Microsoft.Practices.Unity.Mvc;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(WebApplication.WebUI.App_Start.UnityWebActivator), "Start")]

namespace WebApplication.WebUI.App_Start
{
    /// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
    public static class UnityWebActivator
    {
        /// <summary>Integrates Unity when the application starts.</summary>
        public static void Start() 
        {
            var container = UnityConfig.GetConfiguredContainer();

            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            // TODO: Uncomment if you want to use PerRequestLifetimeManager
            // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
        }
    }
}

引导程序生成的文件App_Start/UnityConfig.cs

using System;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using WebApplication.Domain.Abstract;
using WebApplication.Domain.Concrete;

namespace WebApplication.WebUI.App_Start
{
    /// <summary>
    /// Specifies the Unity configuration for the main container.
    /// </summary>
    public class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        });

        /// <summary>
        /// Gets the configured Unity container.
        /// </summary>
        public static IUnityContainer GetConfiguredContainer()
        {
            return container.Value;
        }
        #endregion

        /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            //container.LoadConfiguration();

            // TODO: Register your types here
            //container.RegisterType<IProductRepository, EFProductRepository>();
        }
    }
}

有什么想法吗?

#region Assembly Microsoft.Practices.Unity.Mvc.dll, v3.0.0.0
// C:\Users\James\Documents\Visual Studio 2013\Projects\Application\packages\Unity.Mvc.3.0.1304.0\lib\Net45\Microsoft.Practices.Unity.Mvc.dll
#endregion

using Microsoft.Practices.Unity;
using System.Collections.Generic;
using System.Web.Mvc;

namespace Microsoft.Practices.Unity.Mvc
{
    // Summary:
    //     Defines a filter provider for filter attributes that support injection of
    //     Unity dependencies.
    public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider
    {
        // Summary:
        //     Initializes a new instance of the Microsoft.Practices.Unity.Mvc.UnityFilterAttributeFilterProvider
        //     class.
        //
        // Parameters:
        //   container:
        //     The Microsoft.Practices.Unity.IUnityContainer that will be used to inject
        //     the filters.
        public UnityFilterAttributeFilterProvider(IUnityContainer container);

        // Summary:
        //     Gets a collection of custom action attributes, and injects them using a Unity
        //     container.
        //
        // Parameters:
        //   controllerContext:
        //     The controller context.
        //
        //   actionDescriptor:
        //     The action descriptor.
        //
        // Returns:
        //     A collection of custom action attributes.
        protected override IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
        //
        // Summary:
        //     Gets a collection of controller attributes, and injects them using a Unity
        //     container.
        //
        // Parameters:
        //   controllerContext:
        //     The controller context.
        //
        //   actionDescriptor:
        //     The action descriptor.
        //
        // Returns:
        //     A collection of controller attributes.
        protected override IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
    }
}

Unity引导程序安装的软件包

Packages installed by Unity bootstrapper

  <package id="Unity" version="3.0.1304.1" targetFramework="net45" />
  <package id="Unity.Mvc" version="3.0.1304.0" targetFramework="net45" />
  <package id="WebActivatorEx" version="2.0.4" targetFramework="net45" />

堆栈:

[ArrayTypeMismatchException: Attempted to access an element as a type incompatible with the array.]
   System.Collections.Generic.List`1.Insert(Int32 index, T item) +58
   System.Collections.ObjectModel.Collection`1.InsertItem(Int32 index, T item) +55
   System.Web.Mvc.FilterProviderCollection.InsertItem(Int32 index, IFilterProvider item) +47
   System.Collections.ObjectModel.Collection`1.Add(T item) +98
   WebApplication.WebUI.App_Start.UnityWebActivator.Start() in c:\Users\James\Documents\Visual Studio 2013\Projects\Application\WebApplication.WebUI\App_Start\UnityMvcActivator.cs:18

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +192
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +155
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +19
   WebActivatorEx.BaseActivationMethodAttribute.InvokeMethod() +236
   WebActivatorEx.ActivationManager.RunActivationMethods(Boolean designerMode) +535
   WebActivatorEx.ActivationManager.RunPreStartMethods(Boolean designerMode) +48
   WebActivatorEx.ActivationManager.Run() +163

[InvalidOperationException: The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..]
   System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +556
   System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +132
   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +102
   System.Web.Compilation.BuildManager.ExecutePreAppStart() +153
   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +516

[HttpException (0x80004005): The pre-application start initialization method Run on type WebActivatorEx.ActivationManager threw an exception with the following error message: Exception has been thrown by the target of an invocation..]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9882460
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +254

推荐答案

已更新解决方案

好的,这很棘手.我不知道您如何设法获得这种类型的项目.您可能已经从早期版本的ASP.NET MVC升级了项目类型.以下是任何答案.

Okay, this was very tricky. I have no idea how you manage to get this type of project. You might have upgraded your project type from an earlier version of ASP.NET MVC. Any way below is the answer.

在Web.Config的运行时程序集绑定部分中,请添加以下内容.

In you Web.Config's runtime Assembly binding section, please add the below.

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>

这应该可以解决您的问题.

This should fix your problem.

这篇关于NuGet的Unity Bootstrapper在App_Start上引发错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-25 18:53