将对象注入延迟加载

Jac*_*cek 4 .net c# model-view-controller ninject inversion-of-control

我有像下面的MVC代码.我使用nInject for IoC.我想知道当我推送请求时,例如SendMail有创建控制器对象,nInject为两个只读对象创建子对象:_mailSrv_dbSrv,但我在这个请求中只需要一个变量.

是否可以将变量注入延迟加载.当代码需要对象时,它会被创建吗?

public class HomeController:Controller
{
    private readonly IMailService _mailSrv;
    private readonly IDatabaseService _dbSrv;

    public HomeController:Controller(IMailService mailSrv, IDatabaseService dbSrv)
    {
        _mailSrv = mailSrv;
        _dbSrv = dbSrv;
    }

    public ActionResult SendMail(string mailAddress)
    {
        _mailSrv.Do(mailAddress);
    }

    public ActionResult SaveToDatabase(int id, string data)
    {
        _dbSrv.Do(id, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 5

刚试了一下.

Ninject.Extensions.Factory添加到项目中,并将成员变量更改为Lazy.

public class HomeController : Controller
{
    private readonly Lazy<IMailService> _mailSrv;
    private readonly Lazy<IDatabaseService> _dbSrv;

    public HomeController(Lazy<IMailService> mailSrv, Lazy<IDatabaseService> dbSrv)
    {
        _mailSrv = mailSrv;
        _dbSrv = dbSrv;
    }

    public ActionResult SendMail(string mailAddress)
    {
        _mailSrv.Value.Do(mailAddress);            
    }

    public ActionResult SaveToDatabase(int id, string data)
    {
        _dbSrv.Value.Do(id, data);            
    }
}
Run Code Online (Sandbox Code Playgroud)

现在将懒惰地创建实例.