1

我目前正在开发我的第一个asp.net mvc 应用程序。我正在尝试从我看到的所有示例项目中汲取灵感,并尝试使用存储库设计模式

我有一个名为 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 引用传递给当前 User 并从那里获取 UserId 会更好?

感谢任何输入!

4

1 回答 1

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

我自己对此有点陌生,所以如果有更好的建议,我也想了解一下。

于 2008-11-22T19:44:34.000 回答