IService расширяет IRepository правильно? - PullRequest
3 голосов
/ 10 октября 2011

Правильно ли сказать, что в моем IService есть все, что есть в IRepository, и более конкретные операции?

Ниже приведен код:

public interface IRepository<T>
{
    T Add(T Entity);
    T Remove(T Entity);
    IQueryable<T> GetAll();
}

public interface IUserService
{

    //All operations IRepository
    User Add(User Entity);
    User Remove(User Entity);
    IQueryable<User> GetAll();

    //Others specific operations 
    bool Approve(User usr);
}

Обратите внимание, что все операции в IRepository также IService.

Это правильно?

Если это так, было бы лучше сделать что-то вроде этого:

public interface IUserService : IRepository<User>
{
    bool Approve(User usr);
}

Другой вариант будет:

public interface IUserService
{
    IRepository<User> Repository { get; }

    //All operations IRepository
    User Add(User Entity);
    User Remove(User Entity);
    IQueryable<User> GetAll();

    //Others specific operations 
    bool Approve(User usr);
}

public class UserService : IUserService
{
    private readonly IRepository<User> _repository;
    public IRepository<User> Repository
    {
        get
        {
            return _repository;
        }
    }

    //Others specific operations 
    public bool Approve(User usr) { ... }
}

Обратите внимание, что я помещаю хранилище как свойство, а в своем классе обслуживания я выставляю это свойство.

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

Каково ваше мнение? Правильно ли это?

1 Ответ

4 голосов
/ 11 октября 2011

Вы, наверное, уже решили это для себя, но я все равно выскажу свое мнение.
Ваш второй пример:

public interface IUserService : IRepository<User>
{
    bool Approve(User usr);
}

это то, что вы должны использовать - это красиво и чисто. Большинство вещей, включенных в IUserService в вашем первом примере, были полностью избыточными, единственное, что на самом деле добавляет IUserService, это bool Approve(User usr). Вы также обнаружите, что если вы используете второй пример, когда вы добавляете UserService и получаете Visual Studio для автоматической реализации IUserService, вы получаете следующее:

public class UserService : IUserService
{
    public bool Approve(User usr)
    {
        throw new NotImplementedException();
    }

    public User Add(User Entity)
    {
        throw new NotImplementedException();
    }

    public User Remove(User Entity)
    {
        throw new NotImplementedException();
    }

    public IQueryable<User> GetAll()
    {
        throw new NotImplementedException();
    }
}

public class User { }

public interface IRepository<T>
{
    T Add(T Entity);
    T Remove(T Entity);
    IQueryable<T> GetAll();
}

public interface IUserService : IRepository<User>
{
    bool Approve(User usr);
}

Как видите, все типы правильно заполнены для вас, без необходимости делать что-либо дополнительное в IUserService.

...