Вопрос о взаимодействии с репозиторием и уровнем обслуживания - PullRequest
4 голосов
/ 01 февраля 2011

У меня есть общий интерфейс репозитория, который имеет обычные методы для сохранения, чтения и запроса с уровня сервиса, например так:

public interface IRepository<T>
{
    T GetById(int id);
    void Save(T entity);
    void Update(T entity);
    void Delete(T entity);
    IEnumerable<T> GetAll();
}

Если у меня есть служба, например, служба пользователя, которая использует конкретную реализацию IRepository с User в качестве типа (IRepository<User>), если самой службе может понадобиться что-то от другого IRepository скажем IRepository<Admin> должна ли служба вызывать IRepository<Admin> напрямую или она должна вызывать связанную службу (т. Е. Службу, которая в основном имеет дело с хранилищем IRepository<Admin>)?

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

1 Ответ

1 голос
/ 01 февраля 2011

Если детали реализации всех репозиториев одинаковы, возможно, вы можете создать абстрактный BaseRepository, например:

protected abstract class BaseRepo<T> : IRepository<T>
     where T : class
{
    #region IRepository Members

    // Implement all IRepository members here and make them public

    #endregion
}

, тогда вы можете создать выделенный AdminRepository, например:

public class AdminRepo : BaseRepo<Admin> {}

и для вызова из другого репозитория вы можете сделать следующее:

public class UserRepo : BaseRepo<User>
{
    private AdminRepo adminRepo = new AdminRepo();

    public UserRepo()
    {
        Admin person = adminRepo.GetById(1);
    }
}

надеюсь, что это поможет.

...