MEF - ApiController - IHttpController 未解析
MEF - ApiController - IHttpController not resolved
我是 MEF 的新手,玩过 MVC,它工作正常。然而,当我尝试使用 Web API 时,外部 api 控制器没有被解析。这是我的 DependencyResolver 代码:
public class MefDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver, IDependencyResolver
{
private readonly CompositionContainer _container;
public MefDependencyResolver(CompositionContainer container)
{
this._container = container;
}
public object GetService(Type serviceType)
{
string name = AttributedModelServices.GetContractName(serviceType);
var service = this._container.GetExportedValueOrDefault<object>(name);
return service;
}
public IEnumerable<object> GetServices(Type serviceType)
{
string name = AttributedModelServices.GetContractName(serviceType);
try
{
var service = this._container.GetExportedValues<object>(name);
return service;
}
catch
{
return new object[] { };
}
}
public System.Web.Http.Dependencies.IDependencyScope BeginScope()
{
return this;
}
public void Dispose()
{}
}
这是它的用法:
var _resolver = new MefDependencyResolver(_container);
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = _resolver;
这是外部 api 控制器:
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
但是当我访问我的网站时:
http://localhost:65232/api/values
我收到这个错误:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:65232/api/values'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'values'.
</MessageDetail>
</Error>
同一容器适用于我的 MVC 控制器,但似乎无法适用于 API 个控制器。
我错过了什么吗?
这里涉及两个接口,它们的名称相同 IDependencyResolver
因此造成混淆。一种用于 MVC,一种用于 Web API.
我是这样解决的。我有:
public class WebApiDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver
{
...
}
和
public class MvcDependencyResolver : WebApiDependencyResolver, System.Web.Mvc.IDependencyResolver
{
public MvcDependencyResolver(CompositionContainer container)
: base(container)
{
}
}
MvcDependencyResolver
继承自WebApiDependencyResolver
以避免代码重复。
然后您需要使用 MVC 和 Web API 注册解析器。所以在你的启动代码的某处你应该有这样的东西:
var resolver = new MvcDependencyResolver(Container);
System.Web.Mvc.DependencyResolver.SetResolver(resolver); // install MEF dependency resolver for MVC
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = resolver; // install MEF dependency resolver for Web API
说了这么多,我个人不会选择 MEF 来解决控制器问题,因为它引入了 内存泄漏 因为 MEF 保留对 IDisposable
类型和 ApiController
是 IDisposable
.
我是 MEF 的新手,玩过 MVC,它工作正常。然而,当我尝试使用 Web API 时,外部 api 控制器没有被解析。这是我的 DependencyResolver 代码:
public class MefDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver, IDependencyResolver
{
private readonly CompositionContainer _container;
public MefDependencyResolver(CompositionContainer container)
{
this._container = container;
}
public object GetService(Type serviceType)
{
string name = AttributedModelServices.GetContractName(serviceType);
var service = this._container.GetExportedValueOrDefault<object>(name);
return service;
}
public IEnumerable<object> GetServices(Type serviceType)
{
string name = AttributedModelServices.GetContractName(serviceType);
try
{
var service = this._container.GetExportedValues<object>(name);
return service;
}
catch
{
return new object[] { };
}
}
public System.Web.Http.Dependencies.IDependencyScope BeginScope()
{
return this;
}
public void Dispose()
{}
}
这是它的用法:
var _resolver = new MefDependencyResolver(_container);
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = _resolver;
这是外部 api 控制器:
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
但是当我访问我的网站时:
http://localhost:65232/api/values
我收到这个错误:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:65232/api/values'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'values'.
</MessageDetail>
</Error>
同一容器适用于我的 MVC 控制器,但似乎无法适用于 API 个控制器。
我错过了什么吗?
这里涉及两个接口,它们的名称相同 IDependencyResolver
因此造成混淆。一种用于 MVC,一种用于 Web API.
我是这样解决的。我有:
public class WebApiDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver
{
...
}
和
public class MvcDependencyResolver : WebApiDependencyResolver, System.Web.Mvc.IDependencyResolver
{
public MvcDependencyResolver(CompositionContainer container)
: base(container)
{
}
}
MvcDependencyResolver
继承自WebApiDependencyResolver
以避免代码重复。
然后您需要使用 MVC 和 Web API 注册解析器。所以在你的启动代码的某处你应该有这样的东西:
var resolver = new MvcDependencyResolver(Container);
System.Web.Mvc.DependencyResolver.SetResolver(resolver); // install MEF dependency resolver for MVC
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = resolver; // install MEF dependency resolver for Web API
说了这么多,我个人不会选择 MEF 来解决控制器问题,因为它引入了 内存泄漏 因为 MEF 保留对 IDisposable
类型和 ApiController
是 IDisposable
.