无法解析Unity MVC中的类型

时间:2016-07-05 07:40:23

标签: c# asp.net-mvc dependency-injection unity-container

我使用Unity的MVC项目突然停止解析我的控制器中的类型。我正在将设置与新制作的mvc应用程序与Unity nuget包进行比较 - 我看不出任何差异。我的应用程序以前工作过。

我很想开始一个新的应用程序,并从这个应用程序中慢慢移动代码以开始识别问题,但我想我可以在这里寻求一些有用的帮助。

的Global.asax.cs

protected void Application_Start()
{
    log4net.Config.XmlConfigurator.Configure();

    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    UnityConfig2.GetConfiguredContainer().AddNewExtension<Log4NetExtension>();
    UnityConfig2.GetConfiguredContainer().RegisterType<ITest, Test>();           
}

UnityMvcActivator.cs

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(xxx.App_Start.UnityWebActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(xxx.App_Start.UnityWebActivator), "Shutdown")]

namespace xxx.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 = UnityConfig2.GetConfiguredContainer();

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

            var resolver = new UnityDependencyResolver(container);
            DependencyResolver.SetResolver(resolver);

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

        /// <summary>Disposes the Unity container when the application is shut down.</summary>
        public static void Shutdown()
        {
            var container = UnityConfig2.GetConfiguredContainer();
            container.Dispose();
        }
    }
}

在我的HomeController.cs文件中,我只添加一个依赖项:

[Dependency]
public ITest test { get; set; }

通过这种设置,我得到一个例外:当前类型xxx.ITest是一个接口,无法构造。你错过了类型映射吗?

如果我在RegisterType&lt;&gt;()方法调用之后放置一个断点并执行

UnityConfig2.GetConfiguredContainer().Resolve<ITest>()
立即窗口分辨率内的

成功。

此外,将此代码放在Index方法中并注释掉依赖项属性会成功解析实体:

var container = UnityConfig2.GetConfiguredContainer();
var test = container.Resolve<ITest>();

任何人对如何进一步调查此问题都有任何想法?

1 个答案:

答案 0 :(得分:0)

问题是由于一些早期的重构,当我把它转移到另一个项目时,我没有记得从另一个项目中删除UnityWebActivator。所以我有两个容器和两个启动方法。