首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebApi2与IoC

WebApi2与IoC
EN

Stack Overflow用户
提问于 2016-09-20 15:34:01
回答 1查看 573关注 0票数 0

在我的MVC5应用程序中,我使用了来自NuGet的Unity.Mvc4来管理我的依赖注入。

这将创建Bootstrapper.cs,其如下所示:

代码语言:javascript
复制
  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,如下所示:

代码语言:javascript
复制
    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中注入任何内容,如下所示:

代码语言:javascript
复制
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”的控制器时出错。确保控制器具有无参数的公共构造函数。

我知道我需要在我的DependencyResolver下用WebApiConfig做一些事情,但我不太确定是什么。下面是我们班现在的样子:

代码语言:javascript
复制
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 }
        );
    }
}

如能就此事提供任何帮助/建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-20 15:41:45

您只配置了MVC依赖解决程序,也需要对Web框架进行配置。这两个框架都有自己的依赖注入配置。

将其添加到Initialise方法中

代码语言:javascript
复制
public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

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

      return container;
    }

您还需要安装Unity.WebAPI包。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39598246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档