Шаблон репозитория mvc asp.net с сервисным уровнем, когда смешивать объекты в репозиториях? - PullRequest
2 голосов
/ 18 ноября 2011

Я строю новый проект по шаблону репозитория сервисов, подробному здесь .Кажется, это хорошо работает в самых простых примерах.В более сложных сценариях допустимо смешивать объекты в слоях service \ repository ?.Например, скажем, что есть хранилище пользователя и служба, и я хочу иметь возможность создать аудит для создания пользователя, я думаю, что это будет на уровне службы.

Если я буду следовать статье,Сервис автоматически создает объект репозитория пользователя в конструкторе.Добавление аудита будет означать добавление методов аудита CRUD в пользовательский репозиторий?Есть ли смысл делать это?

    public UserService(IValidationDictionary validationDictionary, IUserRrepository repository)
    {
        _validatonDictionary = validationDictionary;
        _repository = repository;
    }

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

по моему опыту вам не нужны репозитории для каждого типа сущностей.Просто создайте один репозиторий для всей модели, а затем используйте над ним запросы linq.EF уже обеспечивает реализацию этого репозитория, вы можете создать пользовательский интерфейс, как показано ниже, и реализовать его поверх этого репозитория.

  public interface IDataContext
    {
        void Add<T>(T entity) where T : BaseEntity;
        void Delete<T>(T entity) where T : BaseEntity;
        IQueryable<T> Find<T>(Expression<Func<T, bool>> where) where T : BaseEntity;
        int SaveChanges()
    }

, где ваш базовый объект является вашим базовым классом для всех репозиториев.

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

в нашей реализации, класс, производный от DbContext, реализует этот интерфейс, и весь аудит выполняется черезМетод сохранения с использованием ChangeTracker

Пример реализации EF 4.2 приведен ниже ...

 public class MyContext : DbContext, IDataContext
 {
    static MyContext ()
    {
        Database.SetInitializer<MyContext >(null);
    }

    public T GetById<T>(int id) where T : BaseEntity
    {
        return this.Set<T>().SingleOrDefault(i => i.Id == id);
    }

    public void Add<T>(T entity) where T : BaseEntity
    {
        this.Set<T>().Add(entity);
    }

    public void Delete<T>(T entity) where T : BaseEntity
    {
        this.Set<T>().Remove(entity);
    }

    public IQueryable<T> Find<T>(System.Linq.Expressions.Expression<Func<T, bool>> where) where T : BaseEntity
    {
        return this.Set<T>().Where(where);
    }

    public override int SaveChanges()
    {
        this.SetAuditValues();
        return base.SaveChanges();
    }

   private void SetAuditValues()
    {
        var addedEntries = this.ChangeTracker.Entries().Where(e => e.State ==  System.Data.EntityState.Added);
        var currentUser = this.GetCurrentUser();
        foreach (var addedEntry in addedEntries)
        {
            var entity = addedEntry.Entity as BaseEntity;
            if (entity != null)
            {
                entity.CreateDateTime = DateTime.Now;
                entity.CreateUser = currentUser;
                entity.ModDateTime = DateTime.Now;
                entity.ModUser = currentUser;
            }

        }

        var modifiedEntries = this.ChangeTracker.Entries().Where(e => e.State == System.Data.EntityState.Modified);

        foreach (var modEntry in modifiedEntries)
        {
            var entity = modEntry.Entity as BaseEntity;
            if (entity != null)
            {
                entity.ModDateTime = DateTime.Now;
                entity.ModUser = currentUser;
            }
        }
    }
}
1 голос
/ 19 ноября 2011

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

Теперь, что касается аудита, почему бы просто не вызвать вместо этого уровень обслуживания аудита?включения объекта аудита (если это то, что вы имели в виду)

...