尝试获取类型实例时发生激活错误

时间:2012-02-21 15:22:40

标签: asp.net-mvc-3 unity-container

我使用Unity与Asp.net MVC 3应用程序。以下是在Application_Start ...

中运行的一些代码
        UnityContainer container = new UnityContainer();

        new UnityMappings(container).RegisterTypes();

        DependencyResolver.SetResolver(new UnityServiceLocator(container));

控制器在UnityMappings实例中注册,如此...

IEnumerable<Type> controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                            where typeof (IController).IsAssignableFrom(t)
                                            select t;

    foreach (Type t in controllerTypes)
    {
        container.RegisterType(t);
    }

当我请求页面时,我收到以下错误...(最后一个错误特定于所请求的视图。)

  

尝试获取类型实例时发生激活错误   IControllerFactory,key&#34;&#34;

     

尝试获取类型实例时发生激活错误   IControllerActivator,key&#34;&#34;

     

尝试获取类型实例时发生激活错误   IViewPageActivator,key&#34;&#34;

     

尝试获取类型实例时发生激活错误   ModelMetadataProvider,key&#34;&#34;

然后奇怪的是,我可以点击所有异常,页面工作得非常好!所有其他依赖项都解决得很好。

它不是Visual Studio问题,因为它在不同机器的不同实例中执行。我不得不关闭所有异常,以便我可以完成任何事情。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

当我使用它时,这个错误似乎消失了......

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

... UnityDependencyResolver定义为......

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        this.container = container;
    }

    #region IDependencyResolver Members

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch
        {
            return new List<object>();
        }
    }

    #endregion
}

在我使用UnityServiceLocator&#39;之前这是在Microsoft.Practices.Unity&#39;中定义的。像这样...

DependencyResolver.SetResolver(new UnityServiceLocator(container));

是UnityServiceLocator&#39;不应该以这种方式使用?

答案 1 :(得分:0)

我使用Unity和使用编译视图的MVC3站点有类似的注入问题。

事实证明,在Application_Start中注册事物意味着它们在应用程序启动过程中发生得太晚了。

我使用PreApplicationStartMethod属性解释here来运行所有代码,用于在Application_Start事件之前运行的单独静态方法中注册类型。

我没有得到完全相同的错误,但它在同一区域。测试不需要花费太多精力,所以值得一试。

编辑(因为评论字段太小)

行。根据我的经验,由于假设而排除调查途径通常会导致我浪费大量时间。当然,你应该首先尝试最简单或最明显的解释,但你似乎已经这样做了。

代码本身可能没问题,可能只是因为您的应用程序中存在其他一些细微的差异,因此您可能会在之前调用注入请求,这是您的其他体验。

在我的情况下,相同的代码在另一个应用程序中运行得很好,但在这个代码中失败了,因为我使用的是编译视图......我当时认为这完全不相关。

这可能是很多事情之一。您列出的所有接口都与System.Web.MVC命名空间相关,因此查找(正确)程序集可能会出现问题。如果你声明它不是代码,它只在这个应用程序中发生但在多台机器上的事实表明它可能是其中一个web.config文件中的问题,可能与程序集引用有关。抛出的异常将提供更多信息,特别是InnerException应该提供有关实际导致激活错误的更多详细信息。如果没有,您可以使用Fusion日志查看器钻取到装配加载。

如果不了解应用程序或错误本身,可能很难提供更简洁的建议。