2010-11-20 6 views
0

J'utilise NHibernate et j'ai une classe BootStrapper qui a une méthode qui renvoie une ISession. Dans ma classe Repository, je lui passe un objet ISession. Dans mon contrôleur, je passe son constructeur à un objet IRepository.Enregistrement de la classe dans Ninject et injection de cette classe dans le constructeur

J'ai réussi à lier ma classe IRepository à Repository, mais je n'arrive pas à comprendre comment lier/enregistrer ma classe Repository afin qu'elle reçoive un objet ISession de la classe BootStrapper lorsqu'elle est instanciée et lie mon contrôleur pour recevoir un objet IRepository lors de sa création.

Mon code:

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

     } 
    } 
} 

Comment puis-je lier un ISession à MySqlProductsRepository il reçoit un objet ISession pour son constructeur, et comment puis-je lier si mon contrôleur reçoit un IProductsRepository dans son constructeur?

Répondre

2

Vous pouvez lier ISession à un fournisseur. Dans ce cas, vous pouvez modifier la classe BootStrapper pour qu'elle hérite de Provider et implémenter la méthode CreateInstance.

Cela ressemblerait que:

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

Après cela, il suffit d'ajouter la liaison à votre Modul:

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

Cela devrait le faire.

Questions connexes