Asp.net-Web-Api

結構映射無參數建構子錯誤

  • March 21, 2016

我正在嘗試使用 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

引用自:https://stackoverflow.com/questions/25022615