gpt4 book ai didi

asp.net-mvc - 将用户名注入(inject) dbContext( Entity Framework 6)以自动更新列 ModifiedBy/CreatedBy

转载 作者:行者123 更新时间:2023-12-03 00:39:15 25 4
gpt4 key购买 nike

我正在设置 MVC 5、WebApi 2、 Entity Framework 解决方案。我想在数据库中插入审核字段,而无需每次都编写样板代码来执行此操作。我的数据库实体位于引用 EntityFramework 的自己的单独项目中。

到目前为止我已经:

    public class MyDbContext : IdentityDbContext<ApplicationUser>
{
public MyDbContext(/*Autofac can inject stuff here*/)
{
}

public override int SaveChanges()
{
// Updates ModifiedBy, CreatedBy, ModifiedOn, CreatedOn fields
DbContextHelper.TrackSaveChanges(ChangeTracker, userName);

return base.SaveChanges();
}
}

TrackSaveChanges()里面的逻辑并不重要,这只是循环所有更改的实体并设置字段的值。没什么太聪明的。

问题是得到 userName在我的里面DbContext派生类。我认为最好的方法是将其注入(inject) MyDbContext构造函数?

有使用HttpContext.Current.User的建议,但我不想向我的数据项目添加 Web 依赖项。也可以直接引用HttpContext会损害单元可测试性。

  • 我已经尝试过 Autofac builder.Register<IPrincipal>(ip => HttpContext.Current.User);注入(inject)IPrincipal到 dbcontext 中,但这会引发异常,因为 HttpContext.Current.User 在创建时为 null。
  • 如果必须的话,我更愿意使用 HttpContextBase代替HttpContext .

有没有一种干净的方法可以做到这一点?我正在使用 Entity Framework 6、WebAPI 2、ASP NET Identity 和 Autofac。

最佳答案

您可以注入(inject)一个接口(interface)而不是字符串值本身:

interface IUserNameProvider
{
string GetUserName();
}

具体实现将使用HttpContext.Current.User,但这种方法不会损害可测试性,因为接口(interface)可以轻松模拟。

interface HttpContextUserNameProvider : IUserNameProvider
{
public string GetUserName()
{
return HttpContext.Current.User;
}
}

客户端代码示例:

public class MyDbContext : IdentityDbContext<ApplicationUser>
{
internal IUserNameProvider _userNameProvider;

public MyDbContext(IUserNameProvider userNameProvider)
{
_userNameProvider = userNameProvider;
}

public override int SaveChanges()
{
string userName = _userNameProvider.GetUserName();
// ...
}
}

关于asp.net-mvc - 将用户名注入(inject) dbContext( Entity Framework 6)以自动更新列 ModifiedBy/CreatedBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35081634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com