ASP.NET MVC3依赖注入误解

Ant*_*zer 1 asp.net-mvc dependency-injection unity-container asp.net-mvc-3

public object GetService(Type serviceType)
{
    object resolvedObject = null;
    try
    {
        resolvedObject = _unityContainer.Resolve(serviceType);
    }
    catch(ResolutionFailedException e) { }

    return resolvedObject;
}
Run Code Online (Sandbox Code Playgroud)

这是捕获异常并返回null的最佳实践吗?默认情况下,mvc尝试解析IControllerFactory和IViewPageActivator,即我得到两个catched异常.我不喜欢这个解决方案.

我的朋友建议检查serviceType IControllerFactory,IViewPageActivator如果引发异常 - 捕获并记录错误.但就我而言 - 它不是最好的解决方案,它就像硬编码一样.

Mat*_*ott 5

MVC3 DependencyResolver是一个服务定位器,首先是.它本质上是MVC和公共服务定位器(的lovechild commonservicelocator.codeplex.com).CSL服务定位器和MVC3之间的区别在于DependencyResolverMVC架构师决定他们需要一种更安全的方式来处理无法通过它解决服务的情况,他们选择的答案是IDependencyResolver在这些情况下应该返回null 的实现.

使用IServiceLocator的CSL实现,标准做法是抛出一个ActivationException允许处理这些情况的标准化异常.

使用MVC,框架将调用DependencyResolver以尝试解析已配置的服务.如果找不到合适的服务,则使用默认值.

例如,当它想要找到时IControllerFactory,它将检查第DependencyResolver一个.如果它在那里失败,它将使用DefaultControllerFactory配置的through ControllerBuilder.SetControllerFactory(...).由于这种先检查方法,最好返回null,然后让容器特定的异常冒泡.

这意味着您必须在此时捕获/吞噬任何异常,因为MVC框架不负责为您处理它(onus应该在容器/ IDependencyResolver本身上).

你可以在这个阶段记录这个,但MVC3的做法是在这些实例中返回null.