4

需要一个设计建议。请看下面的课程。类只有一种方法 类具有以 userName 和 passWord 作为参数的构造函数。问题是 - 如果我从构造函数中删除用户名和密码 - 并将(用户名,密码)发送到 AuthoriseUser 方法有什么区别

这一切都是在注入依赖的背景下发生的

 public class UserNameAuthorisationService : IUserNameAuthorisationService
{
    private readonly string _userName;
    private readonly string _password;
    private readonly IUserNameAuthorisationRepository _usernameAuthRepository;

    public UserNameAuthorisationService(string UserName, string Password, IUserNameAuthorisationRepository UsernameAuthRepository)
    {
        _userName = UserName;
        _password = Password;
        _usernameAuthRepository = UsernameAuthRepository;
    }

    public IUser AuthoriseUser()
    {
        throw new NotImplementedException();
    }
}

提前致谢。

4

3 回答 3

2

定义参数构造函数的主要思想是使用起始参数启动类。如果您以后不想更改用户/密码,那么使用参数构造函数的好习惯。

另一方面,如果您要更改用户/密码 - 使用set方法和无参数构造函数。

顺便说一句,创建一个未完全初始化的类称为两步构造是一种反模式

于 2012-12-05T19:19:21.190 回答
2

好的,总的来说,我尝试遵循这种模式:如果有机会,我将使用构造函数注入来处理外部依赖项

  1. 我将尽可能使用构造函数注入
  2. 如果不可能合并构造函数注入并且我有一个很好的默认值,我将使用属性注入
  3. 方法注入在特定情况下具有一定的优势,因为每个方法调用的依赖关系可能会有所不同(查看此处了解更多详细信息:http : //manning.com/seemann/DIi.NET_sample_ch04.pdf

在您的情况下,我会执行以下操作:

  1. 将存储库注入留在构造函数中
  2. 将用户名和密码移至方法上下文,因为它们很可能不会由 DI 容器提供,但它们是特定于上下文的。我不会将这些参数视为依赖项,而是将其视为值对象。

Having the constructor injection in place is the best possible approach with the DI in general. One of the biggest advantages is that you can easily see if your class violates SOLID principles and you see how many dependencies you have in a single place

于 2012-12-05T19:55:04.770 回答
1

在构造函数中传递初始参数对非可变对象有好处,就好像您不提供 setter 方法一样,“不可能”(如果不考虑任何反射技巧)来更改它们。

如果您计划不允许通过 API 更改此值,这是实现此要求的唯一方法。否则,您可以实现设置器。即使实现了 setter,你也可能认为这个对象没有用户名和密码就不能存在(存在毫无意义),在这种情况下,我会同时保留 setter 和构造函数的初始化。

正如我所见,如果没有密码/用户名/存储库,这个对象就没有任何意义,所以我会将它们的初始化保留在构造函数中。

如果应该充当一个组件,我会将用户名和密码参数移动到AuthoriseUser方法中,并且具有例如一个唯一的应用程序实例(您的 DI 容器应该管理它)。UserNameAuthorisationService在这种情况下,我将通过 DI 将该对象注入到客户端对象中。

关键是要让你的对象始终保持一致的状态,而不是使用 init() 或 populate() 方法。因此,正如@Maxim 指出的那样,始终完全初始化您的对象并使它们始终处于可用状态,以某种方式,如果AuthoriseUser()在没有应该预先填充的强制参数的情况下调用,您不必抛出异常。

于 2012-12-05T19:39:02.867 回答