2011-07-23 142 views
2

我有一类称为MyMailSender结合称为EmailController的asp.net控制器。ASP.NET MVC和Ninject 2.0绑定问题

E.g.

public EmailController(IMailSender sender) 
    { 
     //MyMailSender 
     this.sender = sender; 
    } 

MyMailSender类也依赖于一个名为MessageSender类。

现在我的过程中通过执行以下作品,未经注射。

public class MyMailSender : IMailSender 
{ 
    private IMessageSender messageSender; 

    public MyMailSender() 
    { 
     messageSender = new SmtpMessageSender("mail.address.com", 25); 
    } 
} 

如何使用Ninject将此依赖类绑定到MyMailSender类?

MyMailSender最初的结合是通过控制器工厂结合

public override void Load() 
     { 
       Bind<IMailSender>() 
       .To<MyMailSender>();    
     } 

我试图绑定到控制器工厂像做:

Bind<IMessageSender>() 
     .To<SmtpMessageSender>().WithConstructorArgument("mail.address.com", 25); 

,但我怀疑,我不应该绑定在这里对这种类型的结合。我有什么选择?

我的错误信息是:

Error activating string 
No matching bindings are available, and the type is not self-bindable. 
Activation path: 

    4) Injection of dependency string into parameter hostname of constructor of type SmtpMessageSender 

    3) Injection of dependency IMessageSender into parameter messageSender of constructor of type MyMailSender 

    2) Injection of dependency IMailSender into parameter sender of constructor of type EmailController 

    1) Request for EmailController 


Suggestions: 
    1) Ensure that you have defined a binding for string. 

    2) If the binding was defined in a module, ensure that the module has been loaded into the kernel. 

    3) Ensure you have not accidentally created more than one kernel. 

    4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name. 

    5) If you are using automatic module loading, ensure the search path and filters are correct. 

回答

4

这看上去很好。 (只要这些参数不用于aaplication /线程的生命周期变化)WithConstructorArgument是为那些类型初始化的。

我会改变MyMailSender这样使用构造器注入:

public class MyMailSender : IMailSender 
{ 
    private IMessageSender _messageSender; 

    public MyMailSender(IMessageSender messageSender) 
    { 
     _messageSender = messageSender; 
    } 
} 

,然后在onLoad

public override void Load() 
{      
    Bind<IMessageSender>() 
     .To<SmtpMessageSender>() 
     .WithConstructorArgument("hostname", "mail.address.com") 
     .WithConstructorArgument("port", 25); 
    Bind<IMailSender>() 
     .To<MyMailSender>();  
} 

作为一般的提示,任何时候你在你的类看new财产以后,把它当成一种气味。 new在使用任何DI框架时很少出现在您的代码中(如工厂等)

另一个建议是从某些配置/设置文件加载地址和端口,而不是硬编码。

+0

我试图MyMailSender使用构造器注入从乞讨,并得到一个错误--->错误激活串 没有匹配的绑定是可用的,并且类型不是自可绑定。 激活路径:依赖字符串的 4)注射入式SmtpMessageSender – Keith

+0

对不起的构造函数的参数主机名,看我的更新。您需要指定帕拉姆名称和值使用'WithConstructorArgument()'时。我假设了param的名字,但你明白了。 – Mrchief

+0

谢谢!那样做了! – Keith