2010-11-20 5 views
0

나는 NHibernate를 사용하고 있으며, Session을 반환하는 메서드가있는 BootStrapper 클래스가 있습니다. 내 Repository 클래스에서 ISession 객체를 전달하고 있습니다. 내 컨트롤러에서는 생성자 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은 그것의 생성자에 대한 ISession 개체의 수신을 MySqlProductsRepository에 결합 않고, ​​어떻게 그렇게 내 컨트롤러가 생성자에 IProductsRepository를 수신 결합합니까?

답변

2

당신은 제공자에게 ISession을 바인딩 할 수 있습니다. 이 경우 Provider에서 상속하도록 BootStrapper 클래스를 변경하고 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>(); 
     } 
    } 

을해야한다고처럼 보일 것이다

.

관련 문제