【问题标题】:How to update created and modified fields using the repository design pattern?如何使用存储库设计模式更新创建和修改的字段?
【发布时间】:2008-11-22 18:34:16
【问题描述】:

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

感谢任何意见!

【问题讨论】:

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


    【解决方案1】:

    首先,我建议您将存储库接口设为通用。而不是你的 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)。

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

    【讨论】:

    • 谢谢大卫!服务类是什么意思?我正在使用 WCF 服务与存储库交互......但不确定这是否是您所说的。
    • 不客气。将 WCF 服务视为您的“演示”层,您仍然希望有一个单独的服务类,可以由 WCF 服务以及其他非 WCF 客户端(胖客户端等)使用。看看领域驱动设计,它将让您了解服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多