IService扩展IRepository是否正确?

时间:2011-10-10 16:58:37

标签: c# repository-pattern service-layer

说我的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 个答案:

答案 0 :(得分:4)

你可能已经为自己解决了这个问题,但无论如何我都会提出意见 你的第二个例子:

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中执行任何额外操作。