首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DryIOC WebAPI后备控制器

DryIOC WebAPI后备控制器
EN

Stack Overflow用户
提问于 2016-03-23 13:27:21
回答 2查看 889关注 0票数 1

我正在使用DryIOC.WebAPI来解析我的APIControllers。

因此,WebAPI Config是:

代码语言:javascript
复制
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));


        config.EnableCors();
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        Startup.IocContainer.WithWebApi(config);
        Startup.IocContainer.RegisterWebApiControllers(config);
    }
}

它工作得很好,直到我忘记在IOC容器中创建映射。在这种情况下,依赖解析器无法使用APIController使用DryIOC创建一个实例。

当发生这种情况时,它会返回到默认的WebAPI解析器,该解析器会使用“”错误进行阻塞。

这对我来说是不可取的行为。如果DryIOC解决方案失败,我希望事情就此结束--不会倒退到默认实现,也不会有关于没有默认构造函数的不准确消息。我想知道DryIOC无法解决的类型是什么,所以我可以修复它。

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-03-23 14:35:35

根据Microsoft文档:

ASP.NET Web 2中的依赖注入

如果GetService方法无法解析类型,则应返回null。如果GetServices方法不能解析一个类型,它应该返回一个空集合对象。 不对未知类型的抛出异常。 此接口的实现应该委托给基础依赖注入容器,以便为请求的类型提供注册服务。当没有所请求类型的注册服务时,ASP.NET MVC框架期望此接口的实现将从GetService返回null,并从GetService返回空集合。 当Web创建控制器实例时,它首先调用IDependencyResolver.GetService,传入控制器类型。您可以使用这个扩展钩子来创建控制器,解决任何依赖关系。如果GetService返回null,Web将在控制器类上查找无参数构造函数。

您可以自己重写默认的解析器。

代码语言:javascript
复制
public static class ResolverHelper {
    public static void OverrideResolver(this HttpConfiguration httpConfiguration) {
        var innerResolver = httpConfiguration.DependencyResolver;
        var resolver = new MyDryIocDependencyResolver(innerResolver);
        httpConfiguration.DependencyResolver = resolver;
    }
}

在您的自定义解析器中,无论您想要什么时候都会失败。

来自MyDryIocDependencyResolver的片段

代码语言:javascript
复制
public class MyDryIocDependencyResolver : IDependencyResolver { 
    IDependencyResolver innerResolver;

    public MyCustomDependencyResolver(IDependencyResolver innerResolver) {
        this.innerResolver = innerResolver;
    }

    public IDependencyScope BeginScope() {
        return this;
    }

    public object GetService(Type serviceType) {
        try {
            return innerResolver.Getservice(serviceType);
        } catch (Exception ex) {
            //TODO: Log resolution error
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType) {
        try {
            return innerResolver.GetServices(serviceType);
        } catch (Exception ex) {
           //TODO: Log resolution error
           return new List<object>();
        }
    }

    public void Dispose() {
      // NO-OP 
    }
}

在您的注册中,您可以重写它。

代码语言:javascript
复制
//...other code
Startup.IocContainer.WithWebApi(config);
Startup.IocContainer.RegisterWebApiControllers(config);
config.OverrideResolver();
//...other code

这样,如果/当DryIocDependencyResolver无法解析服务类型时,您仍然会知道什么是未解析的,捕获它,并按照建议的指导方针返回默认值。这两个世界都是最好的。

希望这有帮助

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 16:33:12

使用所有可能的信息检查Controller分辨率问题的另一种方法是使用IContainer.VerifyResolutions方法。

例如:

代码语言:javascript
复制
var container = new Container().WithWebApi(config);
var errors = container.VerifyResolutions();
Debug.Assert(errors.Length == 0);

维基中的更多细节。

注意:是控制器的唯一捕获,当前的DryIoc.WebApi将控制器实现注册为具体的控制器类型,并将其所有实现类型注册为服务类型。因此,对于一个未解析的class MyController: ApiController {}方法,VerifyResolutions将返回3个相同的错误:

  • 一张给MyController
  • 一张给ApiController
  • 一张是IHttpController

您可以将结果验证errorsFactory.FactoryID分组,以获得更紧凑的输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36179502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档