Asp.net-Web-Api
結構映射無參數建構子錯誤
我正在嘗試使用 Web API 2 設置結構圖版本 3.0.5.0。
我遵循了這個實現:Configuring dependency injection with ASP.NET Web API 2.1
但是,在對我的 ComplexesController 進行獲取時出現此錯誤:
嘗試創建類型為“ComplexesController”的控制器時發生錯誤。確保控制器有一個無參數的公共建構子。
誰能看到我的結構圖配置有什麼問題?Create 方法永遠不會被呼叫。
這是我的實現:
public class StructureMapControllerActivator : IHttpControllerActivator { private readonly IContainer _container; public StructureMapControllerActivator(IContainer container) { if (container == null) throw new ArgumentNullException("container"); _container = container; } public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) { try { var scopedContainer = _container.GetNestedContainer(); scopedContainer.Inject(typeof(HttpRequestMessage), request); request.RegisterForDispose(scopedContainer); return (IHttpController)scopedContainer.GetInstance(controllerType); } catch (Exception e) { // TODO : Logging throw e; } } }這個方法是在我的啟動…
public void InitializeContainer() { // STRUCTURE MAP Container container = new Container(); GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container)); container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>()); container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>()); }..這是控制器:
public class ComplexesController : ApiController { private IComplexRepository _repo; public ComplexesController(IComplexRepository repo) { _repo = repo; } // GET: api/Complexes public IList<Complex> GetComplexes() { var complexes = _repo.GetList(); return complexes; } ...我的完整創業課程
[assembly: OwinStartup(typeof(AngularJSAuthentication.API.Startup))] namespace AngularJSAuthentication.API { public class Startup { public void Configuration(IAppBuilder app) { HttpConfiguration config = new HttpConfiguration(); WebApiConfig.Register(config); app.UseWebApi(config); } } }
這裡的問題是您正在使用 GlobalConfiguration 對象而不是 HttpConfiguration 對象註冊服務啟動器。在這種情況下,永遠不會使用 GlobalConfiguration 對象,因為它被 HttpConfiguration 對象替換。為了解決您的問題,您應該將 InitializeContainer() 方法替換為以下內容。
public void InitializeContainer(HttpConfiguration config) { // STRUCTURE MAP Container container = new Container(); config.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container)); container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>()); container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>()); }然後,您應該將 HttpConfiguration 對像從您的 Startup 類傳遞給新的 InitializeContainer() 方法。
希望這可以幫助。
-B