簡體   English   中英

帶有IoC的WebApi2

[英]WebApi2 with IoC

在我的MVC5應用程序中,我使用來自NuGet的Unity.Mvc4來管理我的依賴項注入。

這將創建Bootstrapper.cs ,如下所示:

  public static class Bootstrapper
  {
    public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
      var container = new UnityContainer();

      // register all your components with the container here
      // it is NOT necessary to register your controllers

      // e.g. container.RegisterType<ITestService, TestService>();    
      RegisterTypes(container);

      return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<IUnitOfWork, ApplicationDbContext>();
    }
  }

之后,我在Global.asax.cs下初始化Unity,如下所示:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        Bootstrapper.Initialise(); // < ----- here
    }

我的常規Controller (例如HomeController)在向其構造函數中注入任何內容都沒有問題。 但是,一旦我嘗試在位於相同項目的ApiController注入任何內容,如下所示:

public class ValuesController : ApiController
{
    private readonly IUnitOfWork _repository;

    public ValuesController(IUnitOfWork repository)
    {
        _repository = repository;
    }

    public IEnumerable<PatientData> Get()
    {
        return _repository.Repository.ReturnResults();
    }

    public HttpResponseMessage Get(string id)
    {
        var patient = _repository.Repository.FindById(Convert.ToInt32(id));

        return Request.CreateResponse(HttpStatusCode.OK, patient);
    }
}

並且我嘗試對此構造函數調用簡單的GET請求,突然收到以下錯誤消息:

嘗試創建“ ValuesController”類型的控制器時發生錯誤。 確保控制器具有無參數的公共構造函數。

我知道我需要在WebApiConfig下使用DependencyResolver進行WebApiConfig ,但是我不太確定該做什么。 這是我的班級現在的樣子:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

在此問題上的任何幫助/建議將不勝感激。

您僅配置了MVC依賴關系解析器,還需要針對Web API框架進行配置。 這兩個框架都有自己的依賴項注入配置。

Initialise方法中添加它

public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      GlobalConfiguration.Configuration.DependencyResolver = 
                    new Unity.WebApi.UnityDependencyResolver(container);

      return container;
    }

您還需要安裝Unity.WebAPI軟件包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM