【问题标题】:Activation error occured while trying to get instance of type尝试获取类型实例时发生激活错误
【发布时间】:2012-02-21 15:22:39
【问题描述】:

我将 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,键“”

尝试获取类型实例时发生激活错误 IControllerActivator,键“”

尝试获取类型实例时发生激活错误 IViewPageActivator,键“”

尝试获取类型实例时发生激活错误 ModelMetadataProvider,键“”

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

这不是 Visual Studio 问题,因为它在不同机器的不同实例中执行此操作。我不得不关闭所有异常的中断,这样我才能完成任何事情。

有什么想法吗?

【问题讨论】:

  • Remo Gloor也许他知道答案。 (如您之前的问题Error when using DependencyResolver for Controller instantiation with MVC 3
  • 我再次发这个问题是不是犯了罪?
  • 不是,只是没必要这么做。如果你从 3 个月前就没有解决这个问题,也许你走错了路?
  • 我已经三个月没有在这个网站上工作了。我刚刚开始在休息后再次处理它,并且只有在 Visual Studio 中打开异常时问题才可见。无论如何,你应该建议我走错了路,同时建议我去寻找以前试图帮助我的同一个人的答案,这可能有点讽刺。 ;)
  • 对不起。我不是故意要冒犯你的。祝你好运!

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


【解决方案1】:

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

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
}

在我使用“Microsoft.Practices.Unity”中定义的“UnityServiceLocator”之前...

DependencyResolver.SetResolver(new UnityServiceLocator(container));

“UnityServiceLocator”不应该以这种方式使用吗?

【讨论】:

    【解决方案2】:

    我在使用 Unity 和一个使用编译视图的 MVC3 站点时遇到了类似的注入问题。

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

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

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

    EDIT(因为评论栏太小了)

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

    代码本身可能没问题,可能只是由于您的应用程序中存在一些其他细微差异,因此注入请求被调用得比您期望的其他体验更早。

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

    它可以是许多事情之一。您列出的所有接口都与 System.Web.MVC 命名空间相关,因此查找(正确)程序集可能是个问题。如果您断言它不是代码,那么它仅出现在此应用程序中但出现在多台机器上的事实表明它可能是其中一个 web.config 文件中的问题,可能与程序集引用有关。抛出的异常将提供更多信息,特别是 InnerException 应该提供有关实际导致激活错误的更多详细信息。如果您无法使用 Fusion 日志查看器来深入了解程序集加载。

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

    【讨论】:

    • 感谢您的回复阿列克斯。我遇到的问题是它并没有真正解决问题。您会看到我的 Unity 代码在我处理过的其他应用程序中重复出现了这个问题,所以我认为这段代码应该工作。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    相关资源
    最近更新 更多