Asp.net mvc 3 尝试获取类型的实例时发生激活错误

Asp.net mvc 3 尝试获取类型的实例时发生激活错误,asp.net-mvc-3,unity-container,Asp.net Mvc 3,Unity Container,我正在使用Unity和Asp.NETMVC3应用程序。下面是一些在应用程序启动中运行的代码 UnityContainer container = new UnityContainer(); new UnityMappings(container).RegisterTypes(); DependencyResolver.SetResolver(new UnityServiceLocator(container)); 控制器在UnityMappi

我正在使用Unity和Asp.NETMVC3应用程序。下面是一些在应用程序启动中运行的代码

        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);
    }
IEnumerable controllerTypes=来自Assembly.getExecutionGassembly().GetTypes()中的t
其中typeof(IController).IsAssignableFrom(t)
选择t;
foreach(controllerTypes中的t型)
{
容器注册类型(t);
}
当我请求一个页面时,我得到以下错误。。。(最后一个特定于所请求的视图。)

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

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

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

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

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

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


有什么想法吗?

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

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

如前所述,我使用PreApplicationStartMethod属性在一个单独的静态方法中运行注册类型的所有代码,该方法在应用程序启动事件之前运行

我没有得到完全相同的错误,但它在同一地区。测试不需要太多的努力,所以可能值得一试

编辑(因为注释字段太小)

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

代码本身可能很好,可能只是因为应用程序中存在一些其他细微的差异,注入请求被调用的时间比您从其他经验中预期的要早

在我的例子中,同样的代码在另一个应用程序中运行得很好,但在这个应用程序中失败了,因为我使用的是编译视图。。。我当时认为有些事情完全不相干

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


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

当我使用此选项时,此错误似乎已消失

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”不应该以这种方式使用吗?

问问他是否知道answear。(正如你之前的问题)我再次发布这个问题是否犯了罪?不是,只是没有必要这么做。如果你三个月前还没有解决这个问题,也许你走错了路?我已经三个月没有在这个网站上工作了。我刚刚在休息后再次开始处理它,只有在VisualStudio中打开异常时,问题才可见。不管怎样,也许有点讽刺的是,你竟然建议我走错了路,同时又建议我去寻找以前试图帮助我的人的答案我很抱歉。我不是有意冒犯你的。祝你好运谢谢你的回复。我的问题是,这并不能真正解决问题。你看,我的Unity代码在我工作过的其他应用程序中重复了,但没有出现这个问题,所以我认为这个代码应该可以正常工作。
DependencyResolver.SetResolver(new UnityServiceLocator(container));