在Webforms中使用接口
本文关键字:接口 Webforms | 更新日期: 2023-09-27 18:01:48
我通常为我的ASP创建一个外部类库。. NET项目,我将其引用到我正在工作的项目,然后在任何一个webforms上创建该类的对象,并从后面的代码访问其属性和方法,如下所示:
User usr = new User();
usr.Username = "Username";
usr.Password = "Password";
usr.Register();
我现在和我的一个同事一起工作,他称之为"糟糕的设计",特别是当我为他生成类图时。根据他的说法,"直接在web表单文件后面的代码中实例化对象是糟糕的设计/编程"。他说我应该使用接口,这样,如果对类库进行了更改,我的应用程序不会在前端抱怨任何错误,这意味着我不必在前端更改任何东西。如。如果我将"公共字符串用户名"更改为"公共字符串用户",它不应该在前端给我任何错误,关于代码独立性或类似的东西。所以:
Interface IU = new User();
IU.Username = "Username";
IU.Password = "Password";
IU.Register();
这是我自己的理解,但我希望有人验证和澄清这一点。
这始终是一个意见和最佳实践的问题。
我个人不认为为你的领域对象创建接口有任何意义(除了它作为两个领域对象之间的公共契约)。
接口非常有用的地方是层之间。我将为Register方法声明一个接口,而不是创建一个表示IUser的接口。
这就是设计上的变化。你在声明你的注册方法作为用户本身的一部分。这是一种称为活动记录的常见模式。我个人不喜欢这种方法,原因如下:
- 它将数据访问代码放在您的域对象中(因此一直贯穿您的解决方案)
- 它通常要求解决方案的每个部分相互引用。
我的建议是有一个User类,然后通过Register()方法将其传递到业务逻辑类。然后,这个业务逻辑类将实现IManagerUsers(或者您希望称呼它的任何名称)。
public class User
{
public string Username{get;set;}
public string Password{get;set;}
}
public interface IUserManager
{
bool Register(User user);
}
public class UserManager : IUserManager
{
public bool Register(User user)
{
// register your user here
}
}
这与重命名无关,因为如果重命名接口方法,它仍然会破坏客户端。
对我来说,接口最好的地方是你可以很容易地模仿它们。你不能在一个真正的类中这样做。
。假设您想要对一个创建新用户的方法进行单元测试。例如,CreateNewUser()
创建了一个新的User
对象,并在其上调用Register
。
使用接口,您可以模拟User
对象并强制它的伪Register
方法返回一个对您的测试有意义的值。即:
//arrange
var u = new Mock<IUser>;
u.Setup(x => x.Register()).Returns(true);
//act
var newUser = CreateNewUser();
//assert
Assert.IsNotNull(newUser);
您可以对Register
何时返回false进行另一个测试,以此类推。
如果不使用接口,你的单元测试会是什么样子?
软件开发的原则之一是保持不同的系统松散耦合。在当前上下文中使用接口可以帮助您完成相同的操作。例如,如果您有IUser作为接口,您可以在客户端代码中使用实现IUser接口的任何类。
public class RegisterClass{
private IUser _user;
public RegisterClass(IUser user){
_user = user;
};
public void Validate(){
//you can validate the IUser.
}
}
public class UserOne : IUser {
}
public class UserTwo : IUser {
}
现在灵活性来了,任何以IUser作为接口的具体类都可以使用