在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();

这是我自己的理解,但我希望有人验证和澄清这一点。

在Webforms中使用接口

这始终是一个意见和最佳实践的问题。

我个人不认为为你的领域对象创建接口有任何意义(除了它作为两个领域对象之间的公共契约)。

接口非常有用的地方是层之间。我将为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作为接口的具体类都可以使用