【发布时间】:2012-10-16 05:13:30
【问题描述】:
我有一个 MVC4 Web API 项目,我利用 Mark Seemann 的 Hyprlinkr 组件生成链接资源的 Uris。 (例如客户 -> 地址)。
我已经按照 Mark 的 Dependency injection with Web API 指南(针对 Ninject 进行适当更改)位我不太清楚应该如何将 IResourceLinker 注入我的控制器。
按照 Mark 的 guide 我的 IHttpControllerActivator.Create 创建方法如下所示:
IHttpController IHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController) _kernel.GetService(controllerType);
request.RegisterForDispose(new Release(() => _kernel.Release(controller)));
return controller;
}
Hyprlinkr readme 建议在此方法中创建RouteLinker。不幸的是,我不确定如何向 Ninject 注册。
我不能像下面这样绑定,因为这会导致多个绑定:
_kernel.Bind<IResourceLinker>()
.ToMethod(context => new RouteLinker(request))
.InRequestScope();
我有这样的重新绑定工作:
_kernel.Rebind<IResourceLinker>()
.ToMethod(context => new RouteLinker(request))
.InRequestScope();
但我担心更改 ninject 绑定图对于每个请求都可能是一件坏事。
实现这一目标的最佳方法是什么?
根据Paige Cook的要求更新
我在这里使用重新绑定:
IHttpController IHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
_kernel.Rebind<IResourceLinker>()
.ToMethod(context => new RouteLinker(request))
.InRequestScope();
var controller = (IHttpController) _kernel.GetService(controllerType);
request.RegisterForDispose(new Release(() => _kernel.Release(controller)));
return controller;
}
IHttpControllerActivator.Create 在每个请求上都会被调用。其余绑定以标准方式进行,按标准我的意思是在使用Ninject.MVC3 nuget 包生成的类中。
我的控制器如下所示:
public class CustomerController : ApiController
{
private readonly ICustomerService _customerService;
private readonly IResourceLinker _linker;
public CustomerController(ICustomerService customerService, IResourceLinker linker)
{
_customerService = customerService;
_linker = linker;
}
public CustomerModel GetCustomer(string id)
{
Customer customer = _customerService.GetCustomer(id);
if (customer == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return
new CustomerModel
{
UserName = customer.UserName,
Firstname = customer.Firstname,
DefaultAddress = _linker.GetUri<AddressController>(c => c.Get(customer.DefaultAddressId)),
};
}
}
【问题讨论】:
-
您能否向我们展示您在上下文中执行 _kernel.Rebind 调用的位置以及典型控制器的外观?
-
感谢页面,我添加了更多信息。
-
如需在温莎城堡中使用此功能,请参见此处:stackoverflow.com/q/10854701/126014
标签: dependency-injection ninject asp.net-web-api hyprlinkr