DI与构造函数注入:我是否注入了太多服务?

时间:2014-06-06 19:45:26

标签: asp.net-mvc dependency-injection castle-windsor

使用Castle Windsor作为DI,在我的MVC控制器中,我有以下内容:

    public IAccountService AccountService { get; set; }
    public IPasswordService PasswordService { get; set; }
    public IEmailService EmailService { get; set; }

    public AccountController(IAccountService accountService,
        IPasswordService passwordService, IEmailService emailService)
    {
        AccountService = accountService;
        PasswordService = passwordService;
        EmailService = emailService;
    }

帐户服务正在执行标准身份验证,密码服务用于重置用户密码,电子邮件服务用于向用户发送确认电子邮件。 我的问题是:我在这个构造函数中注入了太多服务吗?这样做有明显的负面影响吗?如果是这样,什么是更好的方法? THX。

2 个答案:

答案 0 :(得分:4)

这实际上是一个意见问题,但我认为很多人都不会有三个注入服务的问题。

我在职业生涯早期学到的经验法则是,任何方法(包括构造函数方法)的参数都超过五个。我自从看到三个以上的论点太多了。

注入太多服务可能会成为您的课程责任太多的症状,但这可能只是这些职责的症状。我个人永远不会为了注入较少的依赖项而重构一个类,但肯定会将此视为审查代码并确保它不是其他问题的症状的理由。

顺便说一句,你应该让你的setter私有(或者甚至更好:使用只读成员变量)来注入的服务 - 通常你不想暴露它们从外面改变

答案 1 :(得分:0)

除了菲尔关于让那些制定者私有化的评论之外,你看起来完全没问题。事实上,有很多例子,尤其是帐户控制器,你需要的不仅仅是注入3个服务。

你想要谨慎的是你正在注射什么,天气与否它首先直接属于控制器。

除此之外,只要您正确使用设计模式(您就是这样),您就无需担心。