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 类型和 ApiControllerIDisposable.