Как обновить созданные и измененные поля, используя шаблон проектирования хранилища? - PullRequest
1 голос
/ 22 ноября 2008

В настоящее время я работаю над моим первым приложением 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();
    }
}

В моих текущих веб-приложениях, когда мои пользователи входят в систему, я сохраняю бизнес-принципал клиента в текущем потоке, а когда мои бизнес-объекты обновляются, я просто использую свойство Name в свойстве Identity текущего бизнес-принципала, и оно прекрасно работает. *

Так в чем же мой вопрос? Должен ли я просто сделать то же самое в методах Add или Update моего репозитория ИЛИ было бы лучше на самом деле передать ссылку IUser текущему пользователю и просто получить оттуда UserId?

Цените любой вклад!

1 Ответ

2 голосов
/ 22 ноября 2008

Сначала я бы предложил сделать ваш интерфейс репозитория универсальным. Вместо вашего IUserRepository попробуйте это:

public interface IRepository<T>
{
    T Add(T entity);
    IQueryable<T> Fetch();
    T Update(T entity);
    void Delete(T entity);
}

Таким образом, вы можете использовать этот интерфейс для любой модели вашего домена.

Что касается вашего вопроса (лично для CreadedBy и ModifiedBy), это звучит как бизнес-логика и лучше подходит для класса обслуживания. Но я бы сделал это так, как ты сказал сначала. Возьмите идентификатор пользователя текущего аутентифицированного пользователя и просто вставьте его туда, вместо того, чтобы передать другой IUser для получения идентификатора. Но если бы он был в сервисе, вы бы могли смоделировать другой сервис для модульного тестирования, без необходимости фактически входить в систему (имея в виду, что смоделированный сервис поставляет фиктивный IUser).

Я сам немного новичок в этом, поэтому, если есть предложения получше, я бы тоже хотел прочитать о них.

...