我正在使用DryIOC.WebAPI来解析我的APIControllers。
因此,WebAPI Config是:
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无法解决的类型是什么,所以我可以修复它。
我怎样才能做到这一点?
发布于 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将在控制器类上查找无参数构造函数。
您可以自己重写默认的解析器。
public static class ResolverHelper {
public static void OverrideResolver(this HttpConfiguration httpConfiguration) {
var innerResolver = httpConfiguration.DependencyResolver;
var resolver = new MyDryIocDependencyResolver(innerResolver);
httpConfiguration.DependencyResolver = resolver;
}
}在您的自定义解析器中,无论您想要什么时候都会失败。
来自MyDryIocDependencyResolver的片段
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
}
}在您的注册中,您可以重写它。
//...other code
Startup.IocContainer.WithWebApi(config);
Startup.IocContainer.RegisterWebApiControllers(config);
config.OverrideResolver();
//...other code这样,如果/当DryIocDependencyResolver无法解析服务类型时,您仍然会知道什么是未解析的,捕获它,并按照建议的指导方针返回默认值。这两个世界都是最好的。
希望这有帮助
发布于 2016-03-24 16:33:12
使用所有可能的信息检查Controller分辨率问题的另一种方法是使用IContainer.VerifyResolutions方法。
例如:
var container = new Container().WithWebApi(config);
var errors = container.VerifyResolutions();
Debug.Assert(errors.Length == 0);维基中的更多细节。
注意:是控制器的唯一捕获,当前的DryIoc.WebApi将控制器实现注册为具体的控制器类型,并将其所有实现类型注册为服务类型。因此,对于一个未解析的class MyController: ApiController {}方法,VerifyResolutions将返回3个相同的错误:
MyControllerApiControllerIHttpController的您可以将结果验证errors按Factory.FactoryID分组,以获得更紧凑的输出。
https://stackoverflow.com/questions/36179502
复制相似问题