C# 当一个类被实例化时,我可以用Ninject注入特定的参数吗?

C# 当一个类被实例化时,我可以用Ninject注入特定的参数吗?,c#,asp.net-mvc,dependency-injection,ninject,C#,Asp.net Mvc,Dependency Injection,Ninject,在本例中,我有一个“用户”类,需要接收对我的EmailService的访问权限。 创建新用户实例时(var user=new user(emailServiceInstance);),我不希望将EmailService实例作为参数包括在内,因为并非所有调用者都知道它。我想让Ninject注射它。 因此,EmailService的绑定通常如下所示: kernel.Bind<IEmailService>().To<EmailService>().InSingletonScop

在本例中,我有一个“用户”类,需要接收对我的EmailService的访问权限。 创建新用户实例时(
var user=new user(emailServiceInstance);
),我不希望将EmailService实例作为参数包括在内,因为并非所有调用者都知道它。我想让Ninject注射它。 因此,EmailService的绑定通常如下所示:

kernel.Bind<IEmailService>().To<EmailService>().InSingletonScope();
public User(string firstName, stringLastName, EmailService emailService)
然后我的用户类构造函数将如下所示:

kernel.Bind<IEmailService>().To<EmailService>().InSingletonScope();
public User(string firstName, stringLastName, EmailService emailService)
First和Lastname将被传入,电子邮件服务将被实例化/注入Ninject。
可能吗?创建此绑定的正确语法是什么?

构造函数注入和属性注入都不适合您的场景。在第4.3节中,Mark Seemann和我声明:

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

使用方法注入,您的
用户
实体将如下所示:

公共类用户
{
公共字符串名{get;}
公共字符串LastName{get;}
公共字符串密码哈希{get;}
公共用户(字符串名、字符串名)
{
this.FirstName=FirstName;
this.LastName=LastName;
}
公共无效重置密码(
IEmailService(邮件服务,IPasswordGenerator)
{
var password=generator.Generate();
this.PasswordHash=generator.Hash(密码);
//警告:这只是一个示例,但不是一个好的安全实践。
//邮寄密码是在PlainTextInversors.com上蒙羞的好方法
mailService.SendMail($@)
你好{这个名字}
我们已收到您帐户的新密码请求。
您的新密码是:{password}。”);
}
}
请注意,
ResetPassword
方法不存储其传入的依赖项。这是经过深思熟虑的,这就是方法注入不同于构造函数注入和属性注入的原因。当依赖项在构造后应用于类时(这是属性注入所发生的情况),它会导致。通过让方法使用依赖项而不是存储依赖项,它可以防止时间耦合的发生


有关方法注入以及如何将其应用于实体类的更详细讨论,请参见的第4.3节。

构造函数注入和属性注入都不适合您的场景。在第4.3节中,Mark Seemann和我声明:

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

使用方法注入,您的
用户
实体将如下所示:

公共类用户
{
公共字符串名{get;}
公共字符串LastName{get;}
公共字符串密码哈希{get;}
公共用户(字符串名、字符串名)
{
this.FirstName=FirstName;
this.LastName=LastName;
}
公共无效重置密码(
IEmailService(邮件服务,IPasswordGenerator)
{
var password=generator.Generate();
this.PasswordHash=generator.Hash(密码);
//警告:这只是一个示例,但不是一个好的安全实践。
//邮寄密码是在PlainTextInversors.com上蒙羞的好方法
mailService.SendMail($@)
你好{这个名字}
我们已收到您帐户的新密码请求。
您的新密码是:{password}。”);
}
}
请注意,
ResetPassword
方法不存储其传入的依赖项。这是经过深思熟虑的,这就是方法注入不同于构造函数注入和属性注入的原因。当依赖项在构造后应用于类时(这是属性注入所发生的情况),它会导致。通过让方法使用依赖项而不是存储依赖项,它可以防止时间耦合的发生


有关方法注入以及如何将其应用于实体等类的更详细讨论,请参见的第4.3节。

您可以使用属性注入,而不是构造函数注入。您应该尽量避免混合数据和行为。通过构造函数注入行为(在设计时已知),并通过方法参数传递数据(在运行时已知)。你的
User
类看起来似乎试图两者兼而有之。你可以使用属性注入,而不是构造函数注入,你应该尽量避免数据和行为的混合。通过构造函数注入行为(在设计时已知),并通过方法argum传递数据(在运行时已知)