【发布时间】:2019-02-07 17:32:55
【问题描述】:
有没有办法在控制器级别解析类的实例?我想覆盖之前由 unity 创建的实例,并通过控制器分配这个新值。
问题是我不确定如何访问网络应用控制器中的统一容器。
这是我的代码:
存储库:
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 所指出的,我无权访问控制器构造函数中的请求。所以让我重新表述一下我的问题:
如何使用包含当前用户详细信息的 UserInformation 对象初始化 UserRepository?我想这样做的原因是,在我的整个应用程序中,我想要用户详细信息,并且我不想从每个方法中传递用户 ID
类似这样:从整个应用程序中的任何方法
UserInformation obj = _userRepository().GetUserInfo();
【问题讨论】:
-
当您应该使用显式依赖原则并将依赖注入构造函数时,您正在使用服务定位器模式。
public CustomerController(IUserRepository repository) { ... } -
另请注意,在控制器的构造函数中访问时,请求尚不可用。您将需要重新考虑存储库和控制器的设计。
-
我的主要目标是使用统一的 Http 请求标头中的值初始化
UserRepository构造函数。有什么想法吗? -
我明白你想做什么。我要告诉你的是,在初始化存储库时,你将无法访问构造函数中的请求。
标签: c# asp.net-web-api dependency-injection unity-container