如何使用存储库设计模式更新创建和修改的字段?

时间:2008-11-22 18:34:16

标签: c# asp.net-mvc repository-design

我目前正在开发第一个 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?

感谢任何输入!

1 个答案:

答案 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)。

我自己对此有点新意,所以如果有更好的建议,我也想了解它们。