在网页API控制器统一决心实例

问题描述 投票:1回答:1

有没有办法在控制器级别解析类的实例?我想覆盖由统一先前创建的实例,并通过控制器分配这个新的价值。

问题是我不知道如何访问的统一容器的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();
c# asp.net-web-api dependency-injection unity-container
1个回答
2
投票

创建一个抽象以访问请求

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.