我需要创建一个基于令牌的身份验证的Web API 2项目,并在所有控制器中实现依赖注入,包括默认 AccountController .

遵循这些步骤

  • 使用Visual Studio 2013

  • 创建新的ASP.Net Web应用程序(Framework 4.5)

  • 选择Web API

  • 身份验证设置为个人用户帐户

我提到了我的服务和 Contract 类dll和包

PM>安装包Unity

PM>安装包Unity.WebApi

改变 Unity.config

public static void RegisterComponents()
{
    var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();
        var section = LoadUnityConfigurationFile();
        section.Configure(container, "parent");
        ////section.Containers.Default.Configure(container);
        container.RegisterInstance(typeof(IUnityContainer), container);

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }



private static UnityConfigurationSection LoadUnityConfigurationFile()
    {
        var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        return section;
    }

我在文件夹配置下添加了一个 unity.config 文件来映射我的控制器和dll(已在上面的代码中指定)

<containers>
        <container name="parent">
          <types>
            <type type= "PROJ.API.Services.Data.IAsUser, PROJ.API.Services"
                mapTo="PROJ.API.Services.Data.AsUser, PROJ.API.Services"></type>
            <type type="PROJ.API.Services.Contracts.IUserServices, PROJ.API.Services.Contracts"mapTo="PROJ.API.Services.Business.UserServices, PROJ.API.Services"></type>
            <type type="PROJ.API.Controllers.AccountController, PROJ.API"
                  mapTo="PROJ.API.Controllers.AccountController, PROJ.API" ></type>
            <type type="PROJ.API.Controllers.HomeController, PROJ.API"
                  mapTo="PROJ.API.Controllers.HomeController, PROJ.API" ></type>

          </types>
        </container>
      </containers>

我添加了一个控制器 UserController 来获取用户详细信息 . 这很好

public class UserController : ApiController
        {

            public UserController(IUnityContainer container)
            {
                this.UnityContainer = container;
            }
            public IUnityContainer UnityContainer { get; set; }

            [HttpGet]
            [Route("Get")]
            public ServiceResponseDto<UserDto> GetUserDetails()
            {
                var userServices = this.UnityContainer.Resolve<IUserServices>();
                return userServices.GetUserDetails();
            }
    }

添加这些控件后,默认 AccountController 已停止工作 .

当我从 Global.asax 取消注释 UnityConfig.RegisterComponents(); 行时,这工作正常

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //UnityConfig.RegisterComponents();  
        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

如何在 AccountController 中添加依赖注入?

namespace AUB.API.Controllers
    {
        [Authorize]
        [RoutePrefix("api/Account")]
        public class AccountController : ApiController
        {
            private const string LocalLoginProvider = "Local";
            private ApplicationUserManager _userManager;

            public AccountController()
            {
            }

            public AccountController(ApplicationUserManager userManager,
            ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
            {
                UserManager = userManager;
                AccessTokenFormat = accessTokenFormat;
            }

            public ApplicationUserManager UserManager
            {
                get
                {
                return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
                }
                private set
                {
                _userManager = value;
                }
            }

            public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }

            // GET api/Account/UserInfo
            [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
            [Route("UserInfo")]
            public UserInfoViewModel GetUserInfo()
            {
                ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);

                return new UserInfoViewModel
                {
                    Email = User.Identity.GetUserName(),
                    HasRegistered = externalLogin == null,
                    LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null
                };
            }
        }
    }

我需要 AccountController 中的所有帐户相关功能,包括依赖注入 . 请帮忙