我目前正在开发第一个 asp.net mvc应用程序。我正在尝试使用我看到的所有示例项目的kool-aid,并尝试使用存储库设计模式。
我有一个名为IUserRepository的接口,如下所示:
public interface IUserRepository
{
IUser Add(IUser user);
IQueryable<IUser> Fetch();
IUser Update(IUser obj);
void Delete(IUser obj);
}
我的IUser接口有一堆CreatedBy,CreatedDate,ModifiedBy和ModifiedDate的属性和属性。
我的UserRepository如下所示:
public class UserRepository : IUserRepository
{
private GimliDataContext db = null;
public UserRepository()
{
db = new GimliDataContext();
}
public UserRepository(string connection)
{
db = new GimliDataContext(connection);
}
public IUser Add(IUser obj)
{
db.Users.InsertOnSubmit((User)obj);
db.SubmitChanges();
return obj;
}
public IQueryable<IUser> Fetch()
{
return db.Users.Select(b => b as IUser);
}
public IUser Update(IUser obj)
{
var user = db.Users.Where(u => u.UserId == obj.UserId).Single();
user.Name = obj.Name;
user.Password = obj.Password;
user.Email = obj.Email;
user.IsLocked = obj.IsLocked;
user.IsDisabled = obj.IsDisabled;
db.SubmitChanges();
return user;
}
public void Delete(IUser obj)
{
var user = db.Users.Where(u => u.UserId == obj.UserId).Single();
db.Users.DeleteOnSubmit(user);
db.SubmitChanges();
}
}
在我当前的Web应用程序中,当我的用户登录时,我将客户业务主体存储在当前线程上,当我的业务对象更新时,我只需在当前业务主体的Identity属性上使用Name属性,它就可以运行。
那么我的问题是什么?我应该在我的存储库的Add或Update方法中做同样的事情,还是最好将IUser引用实际传递给当前用户并从那里抓取UserId?
感谢任何输入!
答案 0 :(得分:2)
首先,我建议您的存储库接口是通用的。而不是你的IUserRepository尝试这个:
public interface IRepository<T>
{
T Add(T entity);
IQueryable<T> Fetch();
T Update(T entity);
void Delete(T entity);
}
这样您就可以将此界面用于任何域模型。
就你的问题而言(CreadedBy和ModifiedBy道具),就个人而言,这听起来像业务逻辑,并且更适合在Service类中。但我会像你先说的那样做。获取当前经过身份验证的用户的用户ID,并将其放在那里,而不是传入另一个IUser来获取ID。但是如果它在服务中你就可以模拟不同的单元测试服务,而不必实际登录系统(让模拟服务提供模拟IUser)。
我自己对此有点新意,所以如果有更好的建议,我也想了解它们。