带有 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 请求,我突然收到以下错误消息:
An error occurred when trying to create a controller of type
'ValuesController'. Make sure that the controller has a
parameterless public constructor.
我知道我需要在 WebApiConfig
下使用 DependencyResolver 做一些事情,但我不太确定是什么。这是我的 class 现在的样子:
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
软件包
在我的 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 请求,我突然收到以下错误消息:
An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor.
我知道我需要在 WebApiConfig
下使用 DependencyResolver 做一些事情,但我不太确定是什么。这是我的 class 现在的样子:
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
软件包