有没有办法在控制器级别解析类的实例?我想覆盖由统一先前创建的实例,并通过控制器分配这个新的价值。
问题是我不知道如何访问的统一容器的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指出我没有访问的控制器构造函数请求。因此,让我再一次改写我的问题:
我将如何初始化UserRepository与包含有关当前用户的详细信息UserInformation
对象?我想这样做的原因是,在我的应用程序,我想用户的详细信息,我不希望从每一个方法通过用户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;
}
}