说我的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) { ... }
}
请注意,我将存储库作为属性,并在我的服务类中公开此属性。
因此,如果您需要在存储库中添加,删除或获取某些对象,我可以通过此属性访问它。
您有什么看法? 这样做是否正确?
答案 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
中执行任何额外操作。