微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实例化类时,可以使用Ninject注入特定的参数吗?

如何解决实例化类时,可以使用Ninject注入特定的参数吗?

就本例而言,我有一个用户”类,需要接收对我的EmailService的访问权限。 每当创建一个新的用户实例(var user = new User(emailServiceInstance);)时,我都不希望将EmailService实例作为参数包括在内,因为并非所有调用者都可以意识到这一点。我希望Ninject注入它。 因此,通常,EmailService的绑定看起来像这样:

kernel.Bind<IEmailService>().To<EmailService>().InSingletonScope();

但是我想在User类构造函数中包含更多参数。我想传递一些参数,并注入EmailService。这可能吗? 从其调用方来看,User类将使用类似以下内容的实例:

var user = new User(firstName,LastName,[notsure])

然后我的User类构造函数将如下所示:

public User(string firstName,stringLastName,EmailService emailService)

将传递名字和姓氏,并使用Ninject实例化/注入电子邮件服务。 可能吗?创建此绑定的正确语法是什么?

解决方法

构造函数注入和属性注入都不适合您的情况。在DIPP&P的第4.3节中,马克·西曼(Mark Seemann)和我声明:

除了其通常的数据成员集之外还包含行为的实体将很容易获得各种各样的方法,每个方法都需要自己的依赖项。尽管您可能很想使用构造器注入来注入此类依赖项,但这会导致需要创建每个此类实体及其所有依赖项的情况,即使对于给定的用例可能只需要几个实体。这使得测试实体的逻辑变得复杂,因为所有依赖都需要提供给构造函数,即使测试可能只对少数依赖感兴趣。方法注入[...]提供了更好的选择。

使用方法注入,您的User实体将变为以下形式:

public class User
{
    public string FirstName { get; }
    public string LastName { get; }
    
    public string PasswordHash { get; }

    public User(string firstName,string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }

    public void ResetPassword(
        IEmailService mailService,IPasswordGenerator generator)
    {
        var password = generator.Generate();
    
        this.PasswordHash = generator.Hash(password);
        
        // Warning: this is just an example,but not a good security practice.
        // Mailing passwords is a good way to be shamed on plaintextoffenders.com
        mailService.SendMail($@"
            Hello {this.FirstName}
            
            We have received new password request for your account.
            
            Your new password is: {password}.");
    }
}

请注意,ResetPassword方法不会存储其传入的依赖项。这是有意的,这就是使方法注入不同于构造函数注入和属性注入的原因。在构造后将依赖项应用于类时(属性注入会发生这种情况),它会导致Temporal Coupling。通过让方法使用依赖关系,而不是 store 依赖关系,可以防止发生时间耦合。

可以在Dependency Injection Principles,Practices,and Patterns的第4.3节中找到有关方法注入以及如何将其应用于诸如实体之类的更详细的讨论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。