如何将活动用户传递给存储库

时间:2017-05-23 16:21:15

标签: c# asp.net-mvc entity-framework

我创建了一个逻辑来审核所有数据库插入/更新/删除。 我从 DBContext 中覆盖了 SaveChanges

[DbConfigurationType(typeof(DataContextConfiguration))]
public sealed class Conexao : DbContext
{
    public Conexao(): base("connectionString")
    {
        base.Configuration.LazyLoadingEnabled = false;
        base.Configuration.ProxyCreationEnabled = false;
        base.Configuration.AutoDetectChangesEnabled = true;
        base.Database.CommandTimeout = 120000;
    }

    public override int SaveChanges()
    {
        /*
        audit logic goes here
        */
        return base.SaveChanges();
    }
}

但我需要注册调用此操作的用户。 问题是我的类在web和app上下文中使用,因此,访问HttpContext来检索活动用户不是解决方案。

如何将用户传递给它?

我是C#和MVC的新手,我对服务,存储库,接口等不熟悉...... 请详细说明你的答案。

1 个答案:

答案 0 :(得分:0)

假设活跃用户意味着登录用户,您可以从当前主体访问用户ID(或用户名,或您在登录时存储在索赔中的任何其他内容)线程,像这样:

var currnentPrincipal = Thread.CurrentPrincipal as ClaimsPrincipal;
var userId=int.Parse(currnentPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value);

您可以在SaveChanges()覆盖中使用此功能;请注意,它没有引用与Web相关的类。

另一个更复杂的解决方案是将HttpContext包装到服务中并通过接口将其注入上下文(或工作单元或您的存储库),但根据我的经验,这比工作更多的工作它会带来好处。