unity resolve instance at web api 控制器
unity resolve instance at web api controller
有什么方法可以在控制器级别解析 class 的实例吗?我想覆盖之前由 unity 创建的实例并通过控制器分配这个新值。
问题是我不确定如何访问 Web 应用程序控制器中的统一容器。
这是我的代码:
存储库:
public class UserRepository: IUserRepository
{
private UserInformation _userInfo;
public UserRepository(string headerValue)
{
_userInfo = LoadUserData(headerValue);
}
public UserInformation GetUserInfo()
{
return _userInfo;
}
}
public class UserInformation
{
public string FirstName;
public string LastName;
}
统一配置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Some code omitted
config.DependencyResolver = new UnityDependencyResolver(UnityConfig.RegisterComponents());
}
}
public static class UnityConfig
{
public static UnityContainer RegisterComponents()
{
//Unity Configuration
var container = new UnityContainer();
container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor("DummyHeaderValue"));
return container;
}
}
控制器:
public class CustomerController : ApiController
{
public CustomerController()
{
//Something like this
container.Resolve<UserRepository>(new InjectionConstructor(Request.GetHeader("RealHeaderValueFromHttpRequest")));
}
}
然后我应该能够在整个应用程序中使用更新的 UserRepository
实例。
有什么想法可以实现吗?
编辑: 正如@Nkosi 所指出的,我无权访问控制器构造函数中的 Request。那么让我重新表述一下我的问题:
如何使用包含当前用户详细信息的 UserInformation
对象初始化 UserRepository?我想这样做的原因是在我的整个应用程序中我想要用户详细信息并且我不想从每个方法传递用户 ID
类似这样的事情:从整个应用程序的任何方法
UserInformation obj = _userRepository().GetUserInfo();
创建抽象以访问请求
public interface IHeaderService {
string RealHeaderValueFromHttpRequest();
}
它的实现将有权访问上下文并请求获得所需的功能
public class HeaderService : IHeaderService {
public string RealHeaderValueFromHttpRequest() {
return HttpContext.Current.Request.Headers["RealHeaderValueFromHttpRequest"];
}
}
该服务现在将显式注入依赖的存储库
public class UserRepository: IUserRepository {
private readonly IHeaderService headerService;
public UserRepository(IHeaderService headerService) {
this.headerService = headerService;
}
public UserInformation GetUserInfo() {
var headerValue = headerService.RealHeaderValueFromHttpRequest();
var _userInfo = LoadUserData(headerValue);
return _userInfo;
}
//...
}
存储库随后也将显式注入依赖控制器。
public class CustomerController : ApiController {
private readonly IUserRepository repositoty;
public CustomerController(IUserRepository repositoty) {
this.repository = repository;
}
public IHttpActionResult SomeAction() {
//NOTE: Only access user info in a controller action
var userInfo = repository.GetUserInfo();
//... use user info.
}
//...
}
现在剩下的就是确保所有抽象及其实现都已注册到依赖容器
public static class UnityConfig {
public static UnityContainer RegisterComponents() {
//Unity Configuration
var container = new UnityContainer();
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<IHeaderService, HeaderService>();
return container;
}
}
有什么方法可以在控制器级别解析 class 的实例吗?我想覆盖之前由 unity 创建的实例并通过控制器分配这个新值。
问题是我不确定如何访问 Web 应用程序控制器中的统一容器。
这是我的代码:
存储库:
public class UserRepository: IUserRepository
{
private UserInformation _userInfo;
public UserRepository(string headerValue)
{
_userInfo = LoadUserData(headerValue);
}
public UserInformation GetUserInfo()
{
return _userInfo;
}
}
public class UserInformation
{
public string FirstName;
public string LastName;
}
统一配置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Some code omitted
config.DependencyResolver = new UnityDependencyResolver(UnityConfig.RegisterComponents());
}
}
public static class UnityConfig
{
public static UnityContainer RegisterComponents()
{
//Unity Configuration
var container = new UnityContainer();
container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor("DummyHeaderValue"));
return container;
}
}
控制器:
public class CustomerController : ApiController
{
public CustomerController()
{
//Something like this
container.Resolve<UserRepository>(new InjectionConstructor(Request.GetHeader("RealHeaderValueFromHttpRequest")));
}
}
然后我应该能够在整个应用程序中使用更新的 UserRepository
实例。
有什么想法可以实现吗?
编辑: 正如@Nkosi 所指出的,我无权访问控制器构造函数中的 Request。那么让我重新表述一下我的问题:
如何使用包含当前用户详细信息的 UserInformation
对象初始化 UserRepository?我想这样做的原因是在我的整个应用程序中我想要用户详细信息并且我不想从每个方法传递用户 ID
类似这样的事情:从整个应用程序的任何方法
UserInformation obj = _userRepository().GetUserInfo();
创建抽象以访问请求
public interface IHeaderService {
string RealHeaderValueFromHttpRequest();
}
它的实现将有权访问上下文并请求获得所需的功能
public class HeaderService : IHeaderService {
public string RealHeaderValueFromHttpRequest() {
return HttpContext.Current.Request.Headers["RealHeaderValueFromHttpRequest"];
}
}
该服务现在将显式注入依赖的存储库
public class UserRepository: IUserRepository {
private readonly IHeaderService headerService;
public UserRepository(IHeaderService headerService) {
this.headerService = headerService;
}
public UserInformation GetUserInfo() {
var headerValue = headerService.RealHeaderValueFromHttpRequest();
var _userInfo = LoadUserData(headerValue);
return _userInfo;
}
//...
}
存储库随后也将显式注入依赖控制器。
public class CustomerController : ApiController {
private readonly IUserRepository repositoty;
public CustomerController(IUserRepository repositoty) {
this.repository = repository;
}
public IHttpActionResult SomeAction() {
//NOTE: Only access user info in a controller action
var userInfo = repository.GetUserInfo();
//... use user info.
}
//...
}
现在剩下的就是确保所有抽象及其实现都已注册到依赖容器
public static class UnityConfig {
public static UnityContainer RegisterComponents() {
//Unity Configuration
var container = new UnityContainer();
container.RegisterType<IUserRepository, UserRepository>();
container.RegisterType<IHeaderService, HeaderService>();
return container;
}
}