【发布时间】:2014-10-30 17:11:39
【问题描述】:
我有一个接口“IUser”和一个实现“IUser”的类“User”。我还有一个用于存储库“IUserRepository”的接口。
我介于这两个选项之间:
public interface IUserRepository
{
List<User> getAll();
void addUser(User user);
void alterUser(User user);
void deleteUser(string ID);
bool validateLogin(string session_user, string session_pass);
User getUserByID(int ID);
User getUserByNombre(string name);
User getUserBySessionUser(string session_user);
}
还有这个
public interface IUserRepository
{
List<IUser> getAll();
void addUser(IUser user);
void alterUser(IUser user);
void deleteUser(string ID);
bool validateLogin(string session_user, string session_pass);
IUser getUserByID(int ID);
IUser getUserByNombre(string name);
IUser getUserBySessionUser(string session_user);
}
这是我的困惑。我在存储库接口中的方法是否应该返回真实的实现或接口?正如您在我的第一个选项中看到的那样,我正在返回“用户”实例。我应该返回什么来松散耦合代码?
但如果我在用户存储库的实际实现中选择第二个,我将只能访问我在 IUser 接口中声明的方法和属性。
例如,如果我从一个服务中调用 addUser 方法并传递一个 User 类的实例:
myRepositoryImplementation.addUser(UserInstance);
那么我真正的存储库会喜欢这个
private readonly IUser user;
public void addUser(IUser _user)
{
this.user=_user;
}
不错的有效捕获!但是我将只能访问最初在 IUser 接口中声明的方法和属性,而不能访问在我的 User 实例中声明的任何新方法或属性。
如果我调用 getUserByID 方法,我也会收到一个 IUser 实例。
所以继续这个
1)。这些是有效的方法吗?
2)。如果这些是有效的方法,我应该使用哪一种来保留或保持代码解耦?
3)。如果我也选择第二个如果它有效,那么我应该在界面中声明我以后要使用的所有内容吗?我的意思是属性和方法?
3)。有更好的主意吗?
【问题讨论】:
-
这可能更适合 codereview.stackexchange.com
-
CR.SE 是关于审查工作代码的,而这更像是一个高级设计问题。但是,这可能非常适合程序员。SE
-
接口的重点是公开属性和方法以供其他代码使用,如果您制作 IUser 接口,它应该包含您需要的所有内容。
标签: c# interface dependency-injection loose-coupling