【问题标题】:Ninject And Connection StringsNinject 和连接字符串
【发布时间】:2010-12-20 11:36:34
【问题描述】:

我对 Ninject 非常陌生,正在尝试使用 MVC 和 Linq 的 Ninject 2。我有一个 SqlProductRepository 类,如果我在控制器中注入 Repository 对象,我只想知道在构造函数中传递连接字符串的最佳方法是什么。

public class SqlProductRepository:IProductRepository
{
    private Table<Product> productsTable;

    public SqlProductRepository(string connectionString)
    {
      productsTable = (new DataContext(connectionString)).GetTable<Product>();   
    }

    public IQueryable<Product> Products
    {
        get { return productsTable; }
    }
}

这是我注入存储库的 ProductController 类:

  public class ProductsController : Controller
{
    private int pageSize = 4;
    public int PageSize { get { return pageSize; } set { pageSize = value; } }  

    IProductRepository _productsRepository;

    [Inject]
    public ProductsController(IProductRepository productRepository)
    {
        _productsRepository = productRepository;
    }

    public ViewResult List(int page)
    {
        return View(_productsRepository.Products
                                       .Skip((page - 1) * pageSize)
                                       .Take(pageSize)
                                       .ToList()
                    );
    }
}

有人可以指导我吗?

【问题讨论】:

    标签: asp.net-mvc linq ioc-container ninject


    【解决方案1】:

    您可以在绑定中设置它

    _kernel.Bind<IProductRepository>() .To<SqlProductRepository>() .WithConstructorArgument("connectionString",yourConnectionString );

    【讨论】:

      【解决方案2】:

      你在做:

      new DataContext(connectionString)
      

      在您的代码中 - 这是您尝试使用 DI 容器从代码中推出的新类和绑定。至少,考虑添加一个IConnectionStringSelector 接口或类似的东西。您不希望有 20 个 Bind 调用 20 个存储库 - 您需要比这更高级别的抽象。

      我建议最好的解决方案是您应该在构造函数中要求 IDataContextIDataContextFactory 并让其担心。

      【讨论】:

        【解决方案3】:

        在将SqlProductRepository 绑定到IProductRepository 接口时,您可以提供连接字符串作为构造函数参数。

        public class LinqToSqlModule : NinjectModule
        {
            public override void Load()
            {
                Bind<IProductRepository>().To<SqlProductRepository>()
                    .WithConstructorArgument(connectionString, "connectionstring");
            }
        }
        

        我会建议一种稍微不同的方法。首先,您可能希望在内核中为DataContext 类创建一个绑定。您可以通过使用提供程序类来创建您的DataContext,将连接字符串作为参数传递给其构造函数。然后将DataContext 绑定到DataContextProvider

        public class DataContextProvider : Provider<DataContext>
        {
            protected override DataContext CreateInstance(IContext context)
            {
                string connectionString = "connectionstring";
                return new DataContext(connectionString);
            }
        }
        
        public class LinqToSqlModule : NinjectModule
        {
            public override void Load()
            {
                Bind<DataContext>().ToProvider<DataContextProvider>();
                Bind<IProductRepository>().To<SqlProductRepository>();
            }
        }
        

        接下来修改SqlProductRepository类的构造函数,改为接受DataContext对象。

        public class SqlProductRepository : IProductRepository
        {
            private readonly DataContext context;
        
            public ProductRepository(DataContext context)
            {
                this.context = context;
            }
        
            public IQueryable<Product> Products
            { 
                get { return context.GetTable<Product>(); }
            }
        }
        

        顺便说一句,您不必使用Inject 属性来装饰您的构造函数。 Ninject 默认会选择参数最多的构造函数。

        【讨论】:

          【解决方案4】:

          请参考以下代码截图:

              //Bind the default connection string
              public void BindDataContext()
              {
                  ConstructorArgument parameter = new ConstructorArgument("connectionString", "[Config Value]");
                  Bind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
              }
              //Re-Bind the connection string (in case of multi-tenant architecture)
              public void ReBindDataContext(string cn)
              {
                   ConstructorArgument parameter = new ConstructorArgument("connectionString", cn);
                   Rebind<DataContext>().ToSelf().InRequestScope().WithParameter(parameter);
              }
          

          欲了解更多信息,请访问以下链接

          MVC3, Ninject and Ninject.MVC3 problem

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-29
            • 2023-03-27
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多