Регистрация класса для Ninject и внедрение этого класса в конструкторе - PullRequest
0 голосов
/ 20 ноября 2010

Я использую NHibernate, и у меня есть класс BootStrapper, у которого есть метод, который возвращает ISession.В моем классе репозитория я передаю ему объект ISession.В моем контроллере я передаю его конструктору объект IRepository.

Мне удалось связать мой IRepository с классом Repository, но я не могу понять, как связать / зарегистрировать мой класс Repository, чтобы он получал объект ISession от класса BootStrapper, когда он создается и связываетсямой контроллер для получения объекта 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 в своем конструкторе?

1 Ответ

2 голосов
/ 20 ноября 2010

вы можете привязать ISession к провайдеру.В этом случае вы можете изменить класс BootStrapper для наследования от Provider и реализовать метод CreateInstance.

Это будет выглядеть так:

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

После этого просто добавьте привязку к вашему модулю:

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

Это должно сделать это.

...