2010-11-20 71 views
0

我正在使用NHibernate,并且我有一个BootStrapper类,它有一个返回ISession的方法。在我的Repository类中,我将它传递给一个ISession对象。在我的Controller中,我将其构造函数传递给一个IRepository对象。注册类到Ninject并在构造函数中注入该类

我已经成功地将我的IRepository绑定到Repository类,但我无法弄清楚如何绑定/注册我的Repository类,以便它在实例化时绑定我的控制器并从BootStrapper类接收ISession对象在创建时接收IRepository对象。

我的代码:

public interface IProductsRepository 
{ 
    IQueryable<Product> Products { get; } 
    void SaveProduct(Product product); 
} 


public class MySqlProductsRepository : IProductsRepository 
{ 
    private readonly ISession _session; 

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

    public IQueryable<Product> Products 
    { 
     get 
     { 
      return _session.CreateCriteria(typeof (Product)).List<Product>().AsQueryable(); 
     } 
    } 


public class BootStrapper 
{ 

    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(); 
    } 
} 


public class AdminController : Controller 
{ 
    private readonly IProductsRepository _productsRepository; 

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

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

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

    public class DaisyBlossomsServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductsRepository>().To<MySqlProductsRepository>(); 

     } 
    } 
} 

如何绑定的Isession到MySqlProductsRepository所以它收到一个ISession对象的构造函数,以及如何将它绑定,所以我的控制器,其构造接收IProductsRepository?

回答

2

您可以将ISession绑定到提供程序。在这种情况下,您可以将BootStrapper类更改为从Provider继承并实现CreateInstance方法。

这将看起来像:

public class BootStrapper : Provider<ISession> 
    { 
     ..... 
     protected override ISession CreateInstance(IContext context) 
     { 
      return GetSession(); 
     } 
     .... 
    } 

之后,只需添加绑定到您的MODUL:

public class DaisyBlossomsServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IProductsRepository>().To<MySqlProductsRepository>(); 
      Bind<ISession>().ToProvider<BootStrapper>(); 
     } 
    } 

应该这样做。

相关问题