Asp.net mvc 要更改范围的Ninject条件绑定

Asp.net mvc 要更改范围的Ninject条件绑定,asp.net-mvc,binding,scope,ninject,Asp.net Mvc,Binding,Scope,Ninject,在具有MVC3 Ninject扩展的MVC4应用程序中使用Ninject时,当绑定到存储库(DbContext)时,我想对控制器使用InRequestScope,而在自定义成员身份提供程序中使用相同的存储库时,我想对InSingletonScope 我想这样做: kernel.Bind<IRepo>().To<Repo>().InRequestScope(); kernel.Bind<IRepo>().To<Repo>().WhenInjected

在具有MVC3 Ninject扩展的MVC4应用程序中使用Ninject时,当绑定到存储库(DbContext)时,我想对控制器使用
InRequestScope
,而在自定义
成员身份提供程序中使用相同的存储库时,我想对InSingletonScope

我想这样做:

kernel.Bind<IRepo>().To<Repo>().InRequestScope();
kernel.Bind<IRepo>().To<Repo>().WhenInjectedInto<MembershipHelper>()
                               .InSingletonScope();
kernel.Bind().To().InRequestScope();
kernel.Bind().To().WhenInjectedInto()时
.InSingletonScope();
这样,对控制器的每个web请求都会获得一个新的repo实例,而MembershipProvider会维护到repo的可重用连接


这在开发环境中似乎可以正常工作,但我如何知道正在使用哪个绑定呢?有没有办法测试作用域是否正常工作?

有,没问题。下面是一个非常简单的测试方法:

public interface IRepo { }

public class Repo : IRepo { }

public class MembershipHelper
{
    private readonly IRepo _repo;
    public MembershipHelper(IRepo repo)
    {
        _repo = repo;
    }

    public string GetId()
    {
        return _repo.GetHashCode().ToString();
    }
}

public class HomeController : Controller
{
    private readonly IRepo _repo;
    private readonly MembershipHelper _helper;
    public HomeController(IRepo repo, MembershipHelper helper)
    {
        _repo = repo;
        _helper = helper;
    }

    public ActionResult Index()
    {
        return Content(_repo.GetHashCode().ToString() + " " + _helper.GetId());
    }
}
现在导航到
/home/index
,并观察2个哈希代码。第一个请求在每次请求时都会更改,而第二个请求保持不变