理解Ninject绑定/注入的问题

时间:2010-11-19 22:20:02

标签: ioc-container ninject

在我的MVC项目中,我已经设置了我的MvcApplication_start():

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());

已成功将。关于我的IProductsRepository绑定到MySqlProductsRepository:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel = new StandardKernel(new MyServices());

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
            return null;
        return (IController) _kernel.Get(controllerType);
    }

    public class MyServices: NinjectModule
    {
        public override void Load()
        {

            Bind<IProductsRepository>().To<MySqlProductsRepository>();
        }
    }
}

但我使用的是NHibernate,并且有一个单独的Session Factory类,它有一个返回ISession的GetSession()方法。

public static ISessionFactory SessionFactory = CreateSessionFactory();

    private static ISessionFactory CreateSessionFactory()
    {
        var cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nhibernate.config"));
        cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName, System.Environment.MachineName);
        NHibernateProfiler.Initialize();
        return cfg.BuildSessionFactory();
    }

    public static ISession GetSession()
    {
        return SessionFactory.GetCurrentSession();
    }

我想设置它,以便在创建Ninject时传递我的MySqlProductsRepository和ISession对象:

public class MySqlProductsRepository : IProductsRepository
{
    private readonly ISession _session;

    public MySqlProductsRepository(ISession session)
    {
        _session = session;
    }

我的Controller将交给IProductsRepository实例:

 public class AdminController : Controller
{
    private readonly IProductsRepository _productsRepository;

    public AdminController(IProductsRepository productsRepository)
    {
        _productsRepository = productsRepository;
    }

我的问题:

我似乎无法在我的IoC容器中弄清楚我将IProductsRepository绑定到我的存储库,如何注册ISession,如何在创建时将ISession传递给我的MyProductsRepository对象,并将MyProductsRepository对象传递给我的控制器?

1 个答案:

答案 0 :(得分:2)

我写了几篇博文,解释了如何使用Ninject和ASP.NET MVC应用程序。博客文章中的应用程序使用您正在使用的相同技术:Ninject,NHibernate和MySql。我也在使用存储库模式。你正在做什么和这些帖子之间有很多相似之处。

http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/

http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/

http://blog.bobcravens.com/2010/11/using-ninject-to-manage-critical-resources/

看一看。如果您有任何疑问,请随时与我联系。