Проблема с пониманием Ninject Binding / Injection - PullRequest
2 голосов
/ 20 ноября 2010

В моем проекте MVC я настроил мой MvcApplication_start ():

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

И успешно связали .To относительно моего 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, у которого есть метод GetSession (), который возвращает ISession.

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

Я хотел настроить его так, чтобы мой MySqlProductsRepository был передан и объект ISession объектом Ninject при его создании:

public class MySqlProductsRepository : IProductsRepository
{
    private readonly ISession _session;

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

И моему контроллеру будет передан экземпляр IProductsRepository:

 public class AdminController : Controller
{
    private readonly IProductsRepository _productsRepository;

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

МОЯ ПРОБЛЕМА:

Я не могу понять в своем контейнере IoC, где я связываю свой IProductsRepository с моим репозиторием, как зарегистрировать ISession, как передать ISession моему объекту MyProductsRepository при его создании и передать объект MyProductsRepository мой контроллер?

1 Ответ

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

У меня есть пара постов в блоге, в которых объясняется, как использовать Ninject in и приложение 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/

Посмотрите.Если у вас есть вопросы, не стесняйтесь связаться со мной.

...