从 Session_Start 呼叫服务

Call Service from Session_Start

我有一个 AuditService 我创建的看起来像:

public interface IAuditService
{
    void Log(int userId, string obj, string action, string details);
}

在我的控制器中,我可以这样调用服务:

public class AccountController : BaseController
{
    private readonly IAuditService _auditService;

    public AccountController(IUnitOfWork unitOfWork, IAuditService auditService) : base(unitOfWork)
    {
       ...
        _auditService = auditService;
    }

    [HttpPost]
    public ActionResult UserProfile(ProfileViewModel vm)
    {
        ...
        _auditService.Log(CurrentUser.UserId,"Account", "Edit", "details");
    }
}

这工作正常,但我需要在用户登录时登录。在 Global.asax 文件中,我有一个 Session_start() 方法来获取登录用户。我还需要能够从这里调用 AuditService

protected void Session_Start(object sender, EventArgs e)
    {
        if (Request.IsAuthenticated)
        {
            var sid = System.Web.HttpContext.Current.Request.LogonUserIdentity.User.ToString();

            using (var context = new SqlContext())
            {
                SystemUser user = context.SystemUsers.Where(u => u.UserSid == sid).FirstOrDefault();

                if (user != null)
                {
                    user.LastLogin = DateTime.Now;
                    context.SaveChanges();
                }
            }
        }
    }

关于我应该尝试什么有什么建议吗?我尝试了类似下面几行的操作,但出现 invalid argument 错误。

AuditService audit = new AuditService(DependencyResolver.Current.GetService<IAuditService>().Log);
audit.Log(user.UserId, "Account", "Login", "Successfull login");

由于您使用 Autofac 作为依赖项解析器,您可以使用以下方法获得对 IAuditService 实现的引用:

IAuditService audit = DependencyResolver.Current.GetService<IAuditService>();

然后调用它的方法:

audit.Log(user.UserId, "Account", "Login", "Successfull login");

DependencyResolver