我正在使用EF4开发一个简单的MVC2项目。我也在使用Repository模式,它在控制器的构造函数中实例化。我有34个表,每个表都有CreatedBy和LastModifiedBy字段,需要在保存记录时填充。
关于如何将用户名从控制器传递给除此之外的实体,您还有其他想法:
[HttpPost]
public ActionResult Create(){
Record rec = new Record();
TryUpdateModel(rec);
rec.CreatedBy = HttpContext.Current.User.Identity.Name;
rec.LastModifiedBy = HttpContext.Current.User.Identity.Name;
repository.Save();
return View();
}
答案 0 :(得分:1)
您可以创建自定义模型绑定器,在调用操作之前设置这两个属性。
这样的事情:
public class CustomModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if ((propertyDescriptor.Name == "CreatedBy") || (propertyDescriptor.Name == "LastModifiedBy"))
{
//set value
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
答案 1 :(得分:1)
您可以将其包装在存储库中。如果您的所有实体共享相同的字段,您可以使用这些字段定义低音实体,并从该字段中派生出其他实体(每个具体类层次表)。
然后您可以为您的存储库定义基类,如:
// Other repositories derive from this repository
// BaseEntity is parent of all your entities and it has your shared fields
public abstract class BaseRepository<T> where T : BaseEntity
{
....
public void Save(IIdentity user, T entity)
{
entity.CreatedBy = user.Name;
entity.LastModifiedBy = user.Name;
...
}
}
您可以通过将IIdentity直接传递给存储库构造函数或更好地将一些自定义Identity提供程序传递给存储库构造函数来进一步改进此代码。 Web应用程序的默认提供程序实现将从HttpContext返回标识。