【发布时间】:2017-01-03 19:33:00
【问题描述】:
我有一个基本 api 控制器,我希望所有控制器都根据请求执行,以充当安全机制。这是那个控制器
public abstract class SharepointAuthController : ApiController
{
private ClientContext clientContext;
public SharepointAuthController()
: base()
{
ValidateContext();
}
protected void ValidateContext()
{
if (ControllerContext.Request != null)
{
var spContext = SharePointApiControllerContextProvider.Current.GetSharePointContext(ControllerContext);
clientContext = spContext.CreateUserClientContextForSPHost();
if (clientContext == null)
{
throw new AuthenticationException();
}
}
}
protected string GetUserName()
{
User spUser = null;
var spContext = SharePointApiControllerContextProvider.Current.GetSharePointContext(ControllerContext);
using (clientContext = spContext.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
spUser = clientContext.Web.CurrentUser;
clientContext.Load(spUser, user => user);
clientContext.ExecuteQuery();
return spUser.Email;
}
}
throw new AuthenticationException();
}
}
以及调用它的控制器
public class CallPointsController : SharepointAuthController
{
private readonly ICallPointRepository _callPointRepository;
public CallPointsController(ICallPointRepository callPointRepository)
{
_callPointRepository = callPointRepository;
}
[SharePointContextFilter]
[HttpGet]
[Route("api/callpoints")]
public List<CallPointDto> Get()
{
string user = base.GetUserName();
if (!string.IsNullOrEmpty(user))
{
return _callPointRepository.ListAll();
}
return null;
}
}
我现在想扩展 SharepointAuthController 以获取有关用户的其他信息(存在于 DB 中)。我希望能够将存储库传递给基类的构造函数以获得正确的 DI,就像这样
private ClientContext clientContext;
private _repo Repo;
public SharepointAuthController(Repo repo)
: base()
{
ValidateContext();
_repo = repo;
}
protected UserDto GetUserName()
{
User spUser = null;
var spContext = SharePointApiControllerContextProvider.Current.GetSharePointContext(ControllerContext);
using (clientContext = spContext.CreateUserClientContextForSPHost())
{
if (clientContext != null)
{
spUser = clientContext.Web.CurrentUser;
clientContext.Load(spUser, user => user);
clientContext.ExecuteQuery();
return _repo.GetAdditionalUserInfo(spUser.Email);
}
}
throw new AuthenticationException();
}
但是仅仅这样做是行不通的,因为调用这个基类的类没有正确设置
没有给出对应的参数 Repo的必需形式参数'repo'
我这样做的方式是否正确?我可以在没有 DI 的情况下从 Auth 控制器调用 Repo 类
【问题讨论】:
-
你从哪里得到这个错误?你需要传递参数。
-
我在构造函数的 CallPointController 中得到它。
-
所以传递参数。
-
具体在哪里? CallPointController中没有对SharepointController的调用,只是继承。
-
是的;当你继承一个类时,你需要调用它的构造函数(
: base())
标签: c# asp.net-web-api dependency-injection