【问题标题】:Problem with understanding Ninject Binding/Injection理解 Ninject 绑定/注入的问题
【发布时间】:2010-11-19 22:20:02
【问题描述】:

在我的 MVC 项目中,我设置了 MvcApplication_start() :

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

并且已经成功地将一个关于我的 IProductsRepository 的 .To 绑定到 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 类,该类具有返回 ISession 的 GetSession() 方法。

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 时通过 Ninject 传递 ISession 对象:

public class MySqlProductsRepository : IProductsRepository
{
    private readonly ISession _session;

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

我的 Controller 将获得一个 IProductsRepository 实例:

 public class AdminController : Controller
{
    private readonly IProductsRepository _productsRepository;

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

我的问题:

我似乎无法弄清楚在我的 IoC 容器中我将 IProductsRepository 绑定到我的存储库的位置、如何注册 ISession、如何在创建时将 ISession 传递给 MyProductsRepository 对象以及将 MyProductsRepository 对象传递给我的控制器?

【问题讨论】:

    标签: ioc-container ninject


    【解决方案1】:

    我写了几篇博文,解释了如何在 ASP.NET MVC 应用程序中使用 Ninject。博文中的应用程序使用了您正在使用的相同技术: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/

    看看。如果您有任何问题,请随时与我联系。

    【讨论】:

    • +1 很棒的东西 - 填补了市场空白 - 这应该成为此类问题的常见问题解答!
    • 谢谢鲍勃,太好了,现在开始阅读它们,应该是一个主要的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多