我需要创建一个基于令牌的身份验证的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
中的所有帐户相关功能,包括依赖注入 . 请帮忙